2012-04-15 6 views
2

可能性の重複が:
What's the differences between VirtualAlloc and HeapAlloc?VirtualAlloc Vsをいつ使うべきですか?

私はメモリの大きなチャンクを事前に割り当てるしたいと思い、1ギガバイトは、メモリプールを実装すると言います。 Virtual Allocは4kbのページサイズを使用して割り当てます。このシナリオでvirtualallocを新規に使用する利点は何ですか?このシナリオでは新しいものを使用しないでください。あるいは、新しい仮想オーバーヘッドを使用することに不利な点はありますか?

+1

重複http://stackoverflow.com/q/872072/79455 – rve

+0

メモリを大量に割り当て、ページの境界にそって整列させることが有利な場合は、「新」もそうするでしょう。一つの違いは、 'new'は言語の一部であり、' VirtualAlloc'は特定のオペレーティングシステムの一部であるという点です。 –

答えて

4

VirtualAllocを使用すると、1ギガバイトのアドレス範囲を予約できます。後で必要に応じてその一部をコミットすることができます。予約されたアドレスのチャンクには、実際の物理メモリブロックが割り当てられます。予約は失敗しないはずですが、物理メモリが不足しているとコミットが失敗する可能性があります。実際にはウィンドウ上のページングファイルでも、これは常に成功するはずです。

新規は1GBのブロックを予約してコミットします。

1GBブロック全体に即座にアクセスする必要がある場合は、先に進んでnewを使用してください。

初めから1GBブロック全体にアクセスする必要はなく、必要に応じてメモリの一部をコミットするようにアルゴリズムを書くことができれば、VirtualAllocはメモリの消費を最適化できます。

目的に合わせてVirtualAllocを使用することを検討する場合は、いつどのようにメモリをコミットするのが難しいかもしれません。 Jeffrey Richterの本(Advanced Windows 3rd ed。)で見つけた良い方法の1つは、構造化例外処理を使用することです。コードにコミットされていないメモリ例外がスローされたら、それをキャッチしてメモリをコミットし、問題が発生した場所で命令を再試行するようにシステムに指示するだけです。私はこれを試したことはありませんでしたが、私の知る限りこれはスタックが実際に動作する方法です。

関連する問題