以下のC++プログラムでは、new演算子で10MB以上のメモリを確保しているのですが、
タスクマネージャのメモリ使用量は約 1,700 K と表示されます。
しかし、(1)のコメントを外すとメモリ使用量は約 11.000 K と表示されます。
違いが生じるのはなぜでしょうか?
#include <iostream>
using namespace std;
const int N = 10000000;
void foo(char* s) {
for (int i = 0; i < N; i++)
s[i] = 'a';
}
int main() {
char* s = new char[N];
// foo(s); // (1)
s[0] = s[N-1] = 'a';
char c;
while (cin >> c) {
}
}
// g++, cygwin
あまり詳しくないですが…
http://nienie.com/~masapico/doc_MemMan.html
http://m-niwa.hp.infoseek.co.jp/win32/10.html
等にて、メモリの状態に「予約」と「コミット」があるようです。
newしただけでは実際にアクセスしていないので予約状態、foo()で値を設定しているのでコミット状態に移行したのでしょう。
> s[0] = s[N-1] = 'a';
では、仮想メモリ空間にnewで割り当てられたアドレスの内、
先頭ページと最終ページ分だけコミットすれば事足ります。
# Microsoftのサイトのどこかに一次情報あるかと思われますが…
ワーキングセットのサイズの差異,という可能性もありますね。
関連)http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200804/08040013.txt
ありがとうございます。
Process Explorerを試してみました。上のプログラムを(1)をコメントアウトして
実行してみたところ、
Virtual Memory(Private Bytes): 11,664 K
Physical Memory(Working Set): 1,676 K
となっていました。
瀬戸っぷさんに示していただいたページを読んでみました。
メモリ確保と言っても、OS側でいろいろ工夫してくれているのですね。
内容が難しくて、ほとんど理解できませんでしたが…。
ありがとうございました。