0

私のプログラムにはメモリの問題がある可能性があるため、さまざまなツールから提供されるメモリ使用量に関する情報を見つけようとしています。その原因を探るべく、簡単な実験も行っています。リリース モードでは、次のコードを追加します。

pChar = new char[((1<<30)/2)];
for(int i; i < ((1<<30)/2); i++)
{
    pChar[i] = i % 256;
}

コードが実行されても、Windows タスク マネージャーで使用可能な物理メモリは変化しません。私の見解では、コンパイラはパフォーマンスを向上させるためにコードを削除する可能性があります。変数を 1 つのグローバル変数として宣言します。うまくいきません。ただし、デバッグ モードでは、Windows タスク マネージャーで使用可能な物理メモリが期待どおりに変化します。私はそれを理解できません。

別の質問があります。物理メモリが不足した場合、新しい操作は仮想メモリからメモリを割り当てますか。または、1 つの例外がスローされますか?

4

1 に答える 1

0

コンパイラが「書き込み専用」変数を検出する可能性は十分にあります。ではないvolatileため、書き込みは安全に排除でき、OS が実際に RAM を割り当てる必要はありません。

new最新のシステムでは、アドレス空間を割り当てるだけです。必要に応じて物理 RAM が割り当てられます。通常、これは ctor がメンバーを初期化するときに実行されるときに発生します。しかし、new charもちろん俳優はいません。

于 2012-04-16T08:05:26.043 に答える