Подтвердить что ты не робот

DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR Когда, как и почему?

Я обнаружил, что Windows имеет несколько новых Типы данных Windows

DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR

можете ли вы рассказать мне, когда, как и почему их использовать?

4b9b3361

Ответ 1

Типы *_PTR были добавлены в Windows API для поддержки 64-разрядной адресации Win64.

Поскольку 32-битные API обычно передают указатели, использующие типы данных типа DWORD, необходимо было создать новые типы для 64-разрядной совместимости, которые могли бы заменить DWORD в 32-битных приложениях, но были расширены до 64 бит при использовании в 64-битных приложениях.

Итак, например, разработчики приложений, которые хотят писать код, который работает как 32-битный или 64-битный API-интерфейс Windows 32bit SetWindowLong(HWND,int,LONG), были изменены на SetWindowLongPtr(HWND,int,LONG_PTR)

В 32-битной сборке SetWindowLongPtr представляет собой просто макрос, который разрешает SetWindowLong, а LONG_PTR также является макросом, который разрешает LONG. С другой стороны, с 64-битной компоновкой SetWindowLongPtr является API, который принимает в качестве третьего параметра длину 64 бит, а ULONG_PTR - typedef для unsigned __int64.

Используя эти типы _PTR, одна кодовая база может компилироваться как для целей Win32, так и для Win64.


При выполнении арифметики указателей эти типы также должны использоваться в 32-битном коде, который должен быть совместим с 64-битным.

поэтому, если вам нужно получить доступ к массиву с более чем 4 миллиардами элементов, вам нужно будет использовать INT_PTR, а не INT

  CHAR* pHuge = new CHAR[0x200000000]; // allocate 8 billion bytes
  INT idx;
  INT_PTR idx2;
  pHuge[idx]; // can only access the 1st 4 billion elements.
  pHuge[idx2]; // can access all 64bits of potential array space.

Ответ 2

Крис Бекке в значительной степени прав. Просто стоит отметить, что эти типы _PTR - это просто типы, которые имеют 32-разрядную ширину в 32-битном приложении и 64-битной ширине в 64-битном приложении. Это так просто.

Вы можете легко использовать __int3264 вместо INT_PTR, например.