为什么非调度句柄在64位平台上使用指针?

3

为什么不可分配的句柄并不总是uint64_t类型?为什么在64位平台上必须将其表示为ptr

#if !defined(VK_DEFINE_NON_DISPATCHABLE_HANDLE)
#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
        #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
#endif

规范说明:

不可调度的句柄类型是一个64位整数类型,其含义与实现相关,并且可能直接在句柄中编码对象信息,而不是作为对底层对象的引用。非可调度类型的对象在类型内或跨类型中可能没有唯一的句柄值。如果句柄值不唯一,则销毁其中一个句柄不得使其他类型的相同句柄无效,并且如果已经创建的该句柄值比它被销毁的次数多,则不得导致相同类型的相同句柄无效。


我认为他们的想法是确保C和C++是64位的,而不是依赖于内置类型。但是我认为他们的想法相当奇怪。 - 0___________
3
使用结构体和##连接运算符进行hack,使处理类型安全。不同的处理类型会得到不同的结构体类型,将它们混合在代码中现在会产生编译错误。这可能是在早期仅支持32位的版本中使用普通整数类型之后被发现有用的,并且很难进行此类更改,因为它可能会在某些仍然运行的有缺陷的代码上产生构建错误。我猜想,有人受到了另一个广泛使用的API中声明处理方式的启发。 - Hans Passant
这只是一个临时解决方案。在底层,它们通常是指针。我猜它们是64位的,以支持64位平台。在32位平台上,它们可能希望具有相同的大小。因此,即使只使用了32位,也必须使用64位。因此,在32位平台上无法将其定义为指针。在64位平台上使用64位整数时,如果它们实际上是64位指针,则可能存在一些微妙的缺点。 "句柄" 的整个重点是封装,因此理论上您不关心类型是什么。 - William J Bagshaw
@WilliamJBagshaw 我怀疑他们在底层并没有使用指针。如果他们从数组中分配内存,那么一旦数组被重新调整大小,指针可能会失效。这些可能是将索引转换为指针值。 - Michael IV
1个回答

5

并不一定需要使用指针,只需要是64位。

之所以尽可能使用指针,是因为C和C++没有强大的typedef,因此使用指针可以增加一点额外的类型安全性,因为您不能将VkImageView_T*分配给VkImage_T*


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