2012-04-16 9 views
0

すべて 私のプログラムにはメモリの問題がある可能性があるので、さまざまなツールで提供されるメモリ使用量に関する情報を見つけようとします。原因を見つけるために、私は簡単な実験も行います。リリースモードで は、私は、コードが実行されると、Windowsのタスクマネージャで使用可能な物理メモリが変更されませんmomoryが割り当てられたときにタスクマネージャの物理メモリが変更されない

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

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

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

答えて

0

コンパイラが「書き込み専用」変数を検出する可能性は非常に高いです。非volatileなので、書き込みを安全に行うことができ、OSが実際にRAMを割り当てる必要はありません。

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

+0

ありがとうございました。メモリが仮想メモリに割り当てられている場合、プログラムの実行速度が低下しますか?コンパイラやOSによって決定されますか? –

+0

すべての割り当ては仮想メモリに対して行われるため、「仮想メモリ上の遅い場合」という質問は意味をなさないので、決定はしません。 RAMは後で、OSによって割り当てられ、必要な場合にのみ割り当てられ、割り当てには割り当てられません。 – MSalters

関連する問題