我是C编程的菜鸟。我发现 uint64_t 在 libibverbs 中用作缓冲区的地址而不是 void*

struct ibv_sge{
    uint64_t addr;
    uint32_t length;
    uint32_t lkey;
}

我能想到的一个缺点是它的便携性。在 32 位系统上,它会导致编译错误或至少是内存浪费。那么为什么会这样呢?有什么好处吗?

我还注意到还有其他替代方法,例如 uintptr_t 。描述内存通用地址的最佳方法是什么?

最佳答案


骗局:

  • 当使用更窄的通用地址时,它可能会不必要地宽。
  • 当需要更宽的通用地址时,它可能会不必要地变窄。

  • C 没有通用地址。最接近的是 void * ,但仅指定用于对象指针就足够了。 void * 可能不足以用于函数指针。任何函数指针类型与另一种函数指针类型的大小相同。



    对于 C,请改用 union
    union u_pointer {
      void *obj;
      int (*fun)();
    };
    
    但是,读取和写入这些成员的访问需要谨慎处理,就像任何通用指针的情况一样。

    关于c++ - 使用 uint64_t 作为通用内存地址而不是 void* 的优缺点是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45273291/

    10-11 22:13
    查看更多