Почему неуправляемые дескрипторы используют ptr на 64-битных платформах?

Почему неуправляемые дескрипторы не всегда являются uint64_t? Почему необходимо, чтобы они были представлены как ptr на 64-битных платформах?

#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

В спецификации говорится

Non-dispatchable handle types are a 64-bit integer type whose meaning is implementation-dependent, and may encode object information directly in the handle rather than acting as a reference to an underlying object. Objects of a non-dispatchable type may not have unique handle values within a type or across types. If handle values are not unique, then destroying one such handle must not cause identical handles of other types to become invalid, and must not cause identical handles of the same type to become invalid if that handle value has been created more times than it has been destroyed.

Я думаю, что их идея заключалась в том, чтобы сделать так, чтобы C и C++ были 64-битными, а не встроенными типизированными. Но их идея ИМО довольно странная

0___________ 08.08.2018 12:02

Взлом со структурой и оператором вставки токена ## делает дескрипторы безопасными по типу. Вы получаете разные типы структур с разными типами дескрипторов, смешивание их в коде теперь приводит к ошибке компиляции. Вероятно, это было обнаружено как полезное спустя долгое время после того, как они использовали простой целочисленный тип в более ранних 32-разрядных выпусках, и такое изменение было трудно внести, поскольку оно может приводить к ошибкам сборки в ошибочном коде, который так или иначе каким-то образом продолжал работать. Я предполагаю, что кого-то вдохновило то, как дескрипторы объявляются другим широко используемым api.

Hans Passant 08.08.2018 12:10

Это просто путаница. Под капотом они обычно указатели. Я предполагаю, что они 64-битные для поддержки 64-битных платформ. Вероятно, желательно, чтобы они были одинакового размера на 32-битных платформах. Итак, 64 бита, даже если используются только 32. Поэтому они не могут быть определены как указатели на 32-битной платформе. Использование 64-битных целых чисел на 64-битной платформе, когда они на самом деле являются 64-битными указателями, может иметь некоторый тонкий недостаток. Вся суть «дескрипторов» заключается в инкапсуляции, поэтому, теоретически, вам все равно, что это за тип.

William J Bagshaw 08.08.2018 12:34

@WilliamJBagshaw Я сомневаюсь, что они используют указатели под капотом. Если внизу они выделяются из массива, то указатели могут стать недействительными после изменения размера массива. Эти, вероятно, индексы преобразованы в значения указателей.

Michael IV 17.12.2019 12:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Необязательно, чтобы они использовали указатели, только то, что они 64-битные.

Причина, по которой указатели используются, когда это возможно, заключается в том, что C и C++ не имеют строгих определений типов, поэтому использование указателей дает немного дополнительной безопасности типов, потому что вы не можете назначить VkImageView_T* на VkImage_T*.

Другие вопросы по теме