Windowsには新しい機能があることに気付きましたWindows データ型
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
いつ、どのように、なぜそれらを使用するのか教えていただけますか?
ベストアンサー1
これらの*_PTR
型は、Win64 の 64 ビット アドレス指定をサポートするために Windows API に追加されました。
32 ビット API は通常、 のようなデータ型を使用してポインターを渡すためDWORD
、32 ビット アプリケーションで を置き換えることができDWORD
、64 ビット アプリケーションで使用する場合は 64 ビットに拡張される、64 ビット互換性のための新しい型を作成する必要がありました。
例えば、32ビットまたは64ビットとして動作するコードを書きたいアプリケーション開発者は、Windows 32ビットAPISetWindowLong(HWND,int,LONG)
が変更されました。SetWindowLongPtr(HWND,int,LONG_PTR)
32 ビット ビルドでは、SetWindowLongPtr
は に解決される単なるマクロでありSetWindowLong
、LONG_PTR
も同様に に解決されるマクロですLONG
。一方、64 ビット ビルドでは、 はSetWindowLongPtr
64 ビットの long を 3 番目のパラメータとして受け入れる API であり、ULONG_PTR
の typedef ですunsigned __int64
。
これらの型を使用することで_PTR
、1 つのコードベースを Win32 ターゲットと Win64 ターゲットの両方にコンパイルできます。
ポインタ演算を実行する場合、64 ビットとの互換性が必要な 32 ビット コードでもこれらの型を使用する必要があります。
したがって、40億以上の要素を持つ配列にアクセスする必要がある場合は、INTではなくINT_PTRを使用する必要があります。
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.