DWORD_PTR、INT_PTR、LONG_PTR、UINT_PTR、ULONG_PTR いつ、どのように、なぜ? 質問する

DWORD_PTR、INT_PTR、LONG_PTR、UINT_PTR、ULONG_PTR いつ、どのように、なぜ? 質問する

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は に解決される単なるマクロでありSetWindowLongLONG_PTRも同様に に解決されるマクロですLONG。一方、64 ビット ビルドでは、 はSetWindowLongPtr64 ビットの 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.

おすすめ記事