メモリ アドレス空間を拡張する
メモリを管理する:インデックス への移動
ここでは、Win32 のメモリ マネージャのアドレス空間を 2 GB より大きくする方法について説明します。
メモ: Win32 アプリケーションのユーザー モードのアドレス空間のデフォルト サイズは 2GB です。 ただし、これを、32 ビットの Windows の場合は 3GB まで、64 ビットの Windows の場合は 4GB まで拡張することができます。 通常、アドレス空間は、ある程度分断されています。 このため、たとえ 4 GB のアドレス空間を持っていたとしても、1GB をはるかに超える一続きのメモリ ブロックを要求する GetMem が成功する見込みはありません。
より大きなアドレス空間を有効にして利用するには:
- オペレーティング システムが、大きなアドレス空間をサポートしていることを確認します。
- 2GB を超えるユーザー モードのアドレス空間は、64 ビットの Windows でサポートされています。
- サポートされているバージョンの Windows の 32 ビット エディションで、3GB のアドレス空間を有効にするには、コマンド
bcdedit /set {ID} increaseuserva 3072
を実行します。「4-Gigabyte Tuning: BCDEdit and Boot.ini, MSDN Documentation」(4GB チューニング: BCDEdit と Boot.ini - MSDN ドキュメント)を参照してください。
- 適切なリンカ指令を設定します。 オペレーティング システムには、実行ファイルのヘッダーのフラグによって、アプリケーションが 2GB より大きいユーザー モード アドレス空間をサポートすることを知らせる必要があります。 さもないと、2GB のメモリ空間しか提供されません。 このフラグを設定するには、アプリケーションの .dpr ファイルで {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} を指定します。
- すべてのライブラリとサード パーティのコンポーネントが、大きなアドレス空間をサポートしていることを確認します。 2GB のアドレス空間では、すべてのポインタの最上位ビットは常に 0 です。 このため、アドレス空間を大きくすることによって、以前は症状が表れていなかったポインタ演算のバグが露呈する場合があります。 このようなバグは、一般に、ポインタの演算や比較の際に、ポインタを Cardinal 型ではなく Interger 型にキャストしていることが原因です。
メモ: メモリ マネージャによって割り当てられたメモリには、少なくとも 8 バイト境界のアラインメントが保証されます。 16 バイトのアラインメントは、SSE 命令を使用してメモリ ブロックを操作する際に有用です。 ただし、メモリ使用のオーバーヘッドが増えます。 将来の割り当てに対するブロック アラインメントの最小値は、SetMinimumBlockAlignment で設定します。