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;
}
No.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]まではメモリの確保は行われません
回答ありがとうございます。
OS介在の話になるわけなんですね。
アセンブラにて確認しても理解できなかったのが事実なのですが、
OSはアセンブラプログラムをエミュレートして動作させていると
いうことなんですね。WindowsOSは何処まで何をしているかとても
興味深く感じております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- CPU・メモリ・マザーボード PCのメモリについて質問です 8 2022/10/04 09:35
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Windows 10 実装メモリとタスクマネージャーのメモリ使用量不一致について 4 2022/12/15 01:07
- CPU・メモリ・マザーボード 質問お願いします 「「RAM2GB+拡張4GB」などと書いてあるのは、搭載されているメモリ(RAM) 6 2023/08/28 12:31
- CPU・メモリ・マザーボード Windows10 64bitパソコンのメモリ 4GBから8GBへ増設 11 2023/01/25 18:20
- CPU・メモリ・マザーボード メモリが使用可能にならない 3 2022/08/13 17:13
- CPU・メモリ・マザーボード Windows11アップデート後の不具合(メモリ不足)について 9 2023/01/04 11:34
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
VB.netでUSBメモリの固有I...
-
「ヒープサイズの設定」て何?
-
「memcpy」と「strcpy」について
-
C#のOutOfMemoryException発生...
-
EXCEL-VBAにてADOのレコードセ...
-
Linuxでexit()をフックするには?
-
メモリのセグメント違反の解決...
-
メモリの増加に関して
-
FindFirstFile ハンドル開放
-
ExcelのVBAでメモリ解放できない
-
シェル(perl)が使用するメモリ...
-
ReadEventLogについて
-
ファイルマッピング関数で失敗
-
C言語における再帰呼び出しの...
-
mallocとfree
-
DalvikとJVM
-
メモリアクセス時間の計測方法
-
動的メモリとexit(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
エクセルVBA 大容量CSVファイル...
-
EXCEL-VBAにてADOのレコードセ...
-
バッチファイルでの実行EXEのメ...
-
メモリ不足
-
メモリのセグメント違反の解決...
-
メモリが不足しています(VBA)
-
【C言語】再帰が時間がかかる...
-
ファイルマッピング関数で失敗
-
C言語:関数のメモリ上でのサイ...
-
メモリの解放の仕方
-
VC++におけるメモリ使用量について
-
メモリの消費量について
-
Bitmapを重ね合わせる方法
-
メモリを解放しないとどうなる?
-
C#のOutOfMemoryException発生...
-
メモリの解放について VB6 VBA
おすすめ情報