Я обнаружил, что Windows имеет несколько новых Типы данных Windows
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
можете ли вы рассказать мне, когда, как и почему их использовать?
Я обнаружил, что Windows имеет несколько новых Типы данных Windows
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
можете ли вы рассказать мне, когда, как и почему их использовать?
Типы *_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.
Крис Бекке в значительной степени прав. Просто стоит отметить, что эти типы _PTR - это просто типы, которые имеют 32-разрядную ширину в 32-битном приложении и 64-битной ширине в 64-битном приложении. Это так просто.
Вы можете легко использовать __int3264 вместо INT_PTR, например.