为什么在vulkan.h中,非调度对象总是typedef为64位?

6

我来看一下vulkan.h,发现以下内容:

#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || .....
    #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
#else
    #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
#endif

有人知道为什么要使用64位吗?对我来说,始终使用ifdef的第一个案例似乎更合理。


1
“Always”? - 根据所示代码,它们并不是。但在非 64 位平台上,指针的大小会是多少?在第一个案例中使用的平台上它有什么大小呢? - too honest for this site
2
我的问题基于这样一个假设,即64位平台具有64位指针。 - hiddenbit
1个回答

5

规范中明确指出,非调度句柄必须为64位:

非调度句柄类型是一个64位整数类型,其含义取决于实现,并且可能直接在句柄中编码对象信息,而不是指向软件结构。非调度类型的对象可能在类型内或跨类型内没有唯一的句柄值。如果句柄值不唯一,则销毁其中一个句柄不得导致其他类型的相同句柄无效,并且如果该句柄值已经被创建多次而未被销毁,则不得导致相同类型的句柄无效。


感谢您的参考!它比我想象中更简单和明显。 - hiddenbit
2
如果是这样的话,那为什么在64位架构上将句柄定义为指针,而不是uint64_t呢?在阅读了那段文字之后,我认为总是使用#ifdef的第二部分更合理。 - Andrew Williamson
1
@AndrewWilliamson 可能是因为 C 和 C++ 没有强大的 typedef,所以它们使用指针来帮助类型安全。 - ratchet freak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接