Okazało się, że Windows ma jakieś nowe Windows Data TypesDWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR Kiedy, jak i dlaczego?
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
możesz mi powiedzieć kiedy, jak i dlaczego z nich korzystać?
Okazało się, że Windows ma jakieś nowe Windows Data TypesDWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR Kiedy, jak i dlaczego?
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
możesz mi powiedzieć kiedy, jak i dlaczego z nich korzystać?
Typy *_PTR
zostały dodane do interfejsu API Windows w celu obsługi 64-bitowego adresowania Win64.
Ponieważ API 32bit zazwyczaj przekazywane za pomocą wskaźników typy danych jak DWORD
, trzeba było tworzyć nowe typy dla 64 bitowej zgodności, które mogą zastępować DWORD
w aplikacjach 32-bitowych, ale zostały rozszerzone na 64bits gdy jest stosowany w aplikacjach 64-bitowych.
Tak więc, na przykład, programiści, którzy chcą napisać kod, który działa jako 32bit lub 64bit Windows 32bit API SetWindowLong(HWND,int,LONG)
została zmieniona na SetWindowLongPtr(HWND,int,LONG_PTR)
W build 32bit, SetWindowLongPtr
jest po prostu makro, które postanawia SetWindowLong
, i LONG_PTR
jest podobnie jak makro, które rozwiązuje się na LONG
. Z kolei w wersji 64-bitowej SetWindowLongPtr
jest interfejsem API, który jako parametr 3 przyjmuje długość 64-bitową, a ULONG_PTR
- typedef dla unsigned __int64
.
Używając tych typów _PTR
, jedna baza kodowa może skompilować się zarówno dla celów Win32 jak i Win64.
Podczas wykonywania arytmetyki wskaźnika te typy powinny być również używane w kodzie 32-bitowym, który musi być zgodny z 64-bitowym.
więc, jeśli chcesz uzyskać dostęp do tablicy z ponad 4billion elementów, trzeba by użyć INT_PTR zamiast 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.
Dodałbym, że aby z nich skorzystać, robisz #include
Chris Becke jest prawie poprawne. Warto zauważyć, że typy _PTR to tylko typy o szerokości 32 bitów w aplikacji 32-bitowej i 64-bitowej w aplikacji 64-bitowej. To takie proste.
Możesz na przykład użyć __int3264 zamiast INT_PTR.
Powiązane pytanie: Jak wykryć, czy te typy są obsługiwane. Zobacz http://stackoverflow.com/questions/2723284/how-to-detect-if-the-windows-dword-ptr-type-jest-supported-using-an-ifdef – user9876