プロが教えるわが家の防犯対策術!

static 変数にて 大きな配列を取得し、その配列の任意の位置(サンプルでは4k毎) に値を入れた場合、 タスクマネージャのプロセスでメモリ使用量を確認した場合、ステップ実行毎にメモリが増えて行くように見受けられます。

本来C言語なら 実行時にリニアにメモリを取得するとの認識ですが、拡張子がcpp だからか、windows環境だからなのか? 色々と理解できません。
また、4k毎と記載しておりますが、どうも4k毎にメモリを取得しているように見受けられるためにその様に記載いたしました。
しかしメモリダンプで見た場合、リニアに見えていることを考慮すると。


空間的には指定のサイズ分リニアなメモリを用意する(他のメモリとはオーバーラップしない)
使用時に実使用メモリとして管理(カウント)する。 等の動きをしているのでしょうか?

メモリダンプでアドレスをずらしながら確認すると使用メモリの増加が確認できております。

ファイル拡張子をcに変更して、プリプロセッサの設定を変更しても同じ現象の確認が取れました。


大きなメモリを使うのだからmallocを、、、は 今回は無しでお願いします。
純粋になぜこのような動きになっているかを知りたいと思っております。

よろしくお願いします。



OS XP SP3
開発環境 VC2005
ファイル拡張子 cpp
コンソールアプリ
/***************************************/
#include "stdafx.h"

#defineWORK_STATIC_MOMOERY_SZ ( 10 * 1024 * 1024 )
static char work_static_momory[WORK_STATIC_MOMOERY_SZ];

int _tmain(int argc, _TCHAR* argv[])
{
work_static_momory[0] = 0x12;
work_static_momory[ 4 * 1024 ] = 0x12;
work_static_momory[ 8 * 1024 ] = 0x12;
work_static_momory[12 * 1024 ] = 0x12;
work_static_momory[16 * 1024 ] = 0x12;
return 0;
}

A 回答 (1件)

それはもう言語を越えたCPUとOSの実装の話になります


C言語での静的変数は確かに仮想メモリ内では全て確保済みに見えます
しかしOSは全部まとめてゼロページという内容が全部0の物理メモリに結びつけます
だって言語規格的にも0ですから
書き込まれるまでの読み取りは0が返ればいいんです
書き込みが起きたときにそれを検知し初めてOSはメモリを確保してその物理メモリをプロセスの仮想メモリに結びつけます
この仕組みはdemand zero faultとかDemand Pagingとか呼ばれますがやっているのはWindowsだけじゃありません
必要になるまでメモリの確保要りませんから起動の高速化などの利点がありますからサーバー用途、デスクトップ用途のOSはみんなやってます

次に仮想メモリと物理メモリを結びつける仕組みとしてページング方式ってのがあります
1バイト毎に結びつけると管理領域が馬鹿にならないのでOSとCPUはこれをいくらかまとめて管理します
これをページと呼び、普通のWindowsが動くx86 CPUでは通常は4KBを1ページとして管理します
ページ毎に管理している以上仮想メモリに結びつけたらその1ページサイズの物理メモリは確保済みになります
なのでwork_static_momory[0]に書き込みを行ったらwork_static_momory[4095]まではメモリの確保は行われません
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
OS介在の話になるわけなんですね。
アセンブラにて確認しても理解できなかったのが事実なのですが、
OSはアセンブラプログラムをエミュレートして動作させていると
いうことなんですね。WindowsOSは何処まで何をしているかとても
興味深く感じております。

お礼日時:2009/03/24 15:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!