2009-08-13 7 views

Odpowiedz

26

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. 
+1

Dodałbym, że aby z nich skorzystać, robisz #include z nowym systemem kompilacji. – rogerdpack

5

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 problemy