これは、G++4.1.2を使用するCentOS64ビット上のC++にあります。
システムのメモリ使用量をnギガバイトでロードするテストアプリケーションを作成しています。システム全体の負荷はSNMPなどで監視されるという考え方です。したがって、これは監視を実行する方法にすぎません。
しかし、私たちが見たのは、単に次のことをしているということです。
char* p = new char[1000000000];
topまたはfree-mに示されているように、使用されるメモリには影響しません。
メモリ割り当ては、メモリが次の場所に書き込まれると「実際」になるように見えます。
memcpy(p, 'a', 1000000000); //shows an increase in mem usage of 1GB
ただし、すべてのメモリに書き込む必要があります。最初の要素に書き込むだけでは、使用されるメモリの増加は示されません。
p[0] = 'a'; //does not show an increase of 1GB.
これは正常ですか、メモリは実際に完全に割り当てられていますか?使用しているツール(topおよびfree -m)が誤った値を表示しているのか、コンパイラー、ランタイム、カーネルで何か巧妙なことが起こっているのかはわかりません。
この動作は、最適化がオフになっているデバッグビルドでも見られます。
new[]がすぐにメモリを割り当てたのは私の理解でした。C ++ランタイムは、後でアクセスされるまで、この実際の割り当てを遅らせますか?その場合、メモリが実際に割り当てられてからメモリにアクセスするまで、メモリ不足の例外を延期できますか?
それは私たちにとって問題ではありませんが、なぜこれがこのように起こっているのかを知ることは素晴らしいことです!
乾杯!
編集:
ベクターをどのように使用すべきか知りたくありません。これはOO/C ++ /現在のやり方などではありません。提案をするのではなく、なぜこれが現在のように行われているのかを知りたいだけです。それを試す別の方法について。