newとタスクマネージャのメモリ使用量


da  2008-04-12 00:05:16  No: 68003  IP: 192.*.*.*

以下の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

編集 削除
瀬戸っぷ  2008-04-12 00:58:18  No: 68004  IP: 192.*.*.*

あまり詳しくないですが…

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のサイトのどこかに一次情報あるかと思われますが…

編集 削除
YuO  2008-04-12 01:38:06  No: 68005  IP: 192.*.*.*

ワーキングセットのサイズの差異,という可能性もありますね。
関連)http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200804/08040013.txt

編集 削除
da  2008-04-13 02:29:12  No: 68006  IP: 192.*.*.*

ありがとうございます。

Process Explorerを試してみました。上のプログラムを(1)をコメントアウトして
実行してみたところ、

Virtual Memory(Private Bytes): 11,664 K
Physical Memory(Working Set): 1,676 K

となっていました。

編集 削除
da  2008-04-13 02:36:48  No: 68007  IP: 192.*.*.*

瀬戸っぷさんに示していただいたページを読んでみました。
メモリ確保と言っても、OS側でいろいろ工夫してくれているのですね。
内容が難しくて、ほとんど理解できませんでしたが…。

ありがとうございました。

編集 削除