基本的に非常に大きな配列で動作する C++ プログラムを作成しています。Windows では、VirtualAlloc を使用してメモリを配列に割り当てています。これで、VirutalAlloc を使用してメモリを予約することとコミットすることの違いを完全に理解できました。ただし、メモリをページごとに予約領域にコミットすることに利点があるかどうかは疑問です。特に、MSDN ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx ) には、MEM_COMMIT オプションに関する次の説明が含まれています。
仮想アドレスが実際にアクセスされない限り、または実際にアクセスされるまで、実際の物理ページは割り当てられません。
私の実験では、これが確認されています。プロセスのメモリ使用量を増やすことなく、数 GB のメモリを予約してコミットできます (タスク マネージャーに表示されるように)。実際のメモリは、実際にメモリにアクセスしたときにのみ割り当てられます。
ここで、アドレス空間の大部分を予約してから、メモリをページごとに (またはアプリのロジックによってはより大きなブロックで) コミットする必要があると主張する例をかなり見てきました。ただし、上で説明したように、メモリはアクセスする前にコミットされているようには見えません。したがって、ページごとにメモリをコミットすることに実際の利点があるかどうか疑問に思っています。実際、メモリをページごとにコミットすると、実際にメモリをコミットするための多くのシステム コールが原因で、実際にはプログラムの速度が低下する可能性があります。領域全体を一度にコミットすると、システム コール 1 回分の料金が発生しますが、カーネルは、実際に使用するメモリのみを実際に割り当てるのに十分なほど賢いようです。
どちらの戦略が優れているかを誰かが説明してくれれば幸いです。