仮想メモリは、プログラムが扱うものです。malloc
これは、、、その他によって返されたすべてのアドレスで構成されますnew
。各プロセスには、独自の仮想アドレス空間があります。仮想アドレスの使用は、理論的にはプログラムのアドレス サイズによって制限されます。32 ビット プログラムには 4GB のアドレス空間があります。64 ビット プログラムには、はるかに多くの機能があります。実際には、プロセスが割り当てることができる仮想メモリの量は、これらの制限よりも少なくなります。
物理メモリは、マザーボードにはんだ付けされているか、メモリ スロットに取り付けられているチップです。任意の時点で使用される物理メモリの量は、コンピューターの物理メモリの量に制限されます。
仮想メモリ サブシステムは、プログラムが使用する仮想アドレスを、CPU が RAM チップに送信する物理アドレスにマップします。特定の時点で、割り当てられた仮想アドレスのほとんどはマップされていません。したがって、物理メモリの使用量は仮想メモリの使用量よりも少なくなります。割り当てられているがマップされていない仮想アドレスにアクセスすると、オペレーティング システムは目に見えない形で物理メモリを割り当ててマップします。仮想アドレスにアクセスしないと、オペレーティング システムは物理メモリのマップを解除する場合があります。
あなたの質問に順番に答えるには:
- C++ のどの操作が仮想メモリをそれほど膨張させるのでしょうか?
new
、malloc
、大きな配列の静的割り当て。通常、プログラムでメモリを必要とするもの。
- タスクが大量の仮想メモリを使用している場合、問題はありますか?
プログラムの使用パターンによって異なります。一度も触れたことのない大量のメモリ トラックを割り当てる場合、およびプログラムが 64 ビット プログラムである場合、仮想メモリのギグを使用しても問題ない可能性があります。
また、メモリ使用量が際限なく増加すると、最終的にリソースが不足します。
- スタックおよびヒープ関数の変数、ベクトルなど - これらは必然的に物理メモリの使用を増加させますか?
必ずしもそうではありませんが、可能性があります。変数に触れるという行為は、少なくとも瞬間的に、それ (およびそれに「近い」すべてのメモリ) が物理メモリにあることを保証します。(余談: のようなコンテナstd::vector
はスタックまたはヒープに割り当てられますが、含まれるオブジェクトはヒープに割り当てられます。)
- (delete または free() などを介して) メモリ リークを削除すると、必然的に物理メモリと仮想メモリの両方の使用量が削減されますか?
体格:たぶん。仮想: はい。