メモリプールを実装するために、1GBなどの大きなメモリチャンクを事前に割り当てたいと思います。Virtual Alloc は、4kb のページ サイズを使用して割り当てます。このシナリオで new よりも virtualalloc を使用する利点は何ですか? このシナリオでは new を使用すべきではありませんか、それとも仮想割り当てよりも new を使用することの欠点はありますか?
1 に答える
VirtualAlloc を使用すると、1 GB のアドレス範囲を予約できます。後で、必要に応じてその一部をコミットできます。これにより、予約済みアドレスの特定のチャンクに実際の物理メモリ ブロックが割り当てられます。予約が失敗することはありませんが、物理メモリが不足している場合はコミットが失敗する可能性があります。実際、Windows のページング ファイルでは、これも常に成功するはずです。
new は 1GB ブロックを予約してコミットします。
したがって、1GB ブロック全体にすぐにアクセスする必要がある場合は、new を使用してください。
最初から 1GB ブロック全体にアクセスする必要がなく、必要に応じてメモリの一部をコミットするようにアルゴリズムを記述できる場合、VirtualAlloc はメモリ消費を最適化できます。
目的のために VirtualAlloc の使用を検討する場合、メモリをコミットするタイミングと方法を決定するのが難しい場合があります。Jeffrey Richter の本 (Advanced Windows 第 3 版) で見つけた 1 つの優れた方法は、構造化例外処理を使用することです。コードがコミットされていないメモリ例外がスローされると、それをキャッチし、メモリをコミットしてから、問題が発生した命令を再試行するようにシステムに指示するだけです。私はこれを試したことはありませんが、私の知る限り、これはスタックが実際にどのように機能するかです。