現在C言語でプログラミングの勉強(設計含む)をしているのですが、設計書の記載項目に「プログラム領域」「ヒープ領域」「スタック領域」の算出を関数ごとに行うというような記述がありました。
動的メモリ領域・スタック領域の算出方法は何とか調べたのですが、「プログラム領域」の算出方法がわかりません!
出来れば
1.プログラム全体のプログラム領域の算出方法
2.関数ごとのプログラム領域の算出方法
を教えて頂けないでしょうか?
勉強している環境
OS:WindowsXP
コンパイラ:Borland C++ Compiler 5.5
よろしくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
設計するために、メモリ領域のサイズを見積もれという話なのですよね?
静的データ領域、スタック領域、ヒープ領域はおよそ見積もれますが、プログラム領域の見積もりは難しいと思います。というのは、コンパイラの最適化オプション一つでプログラム領域のサイズが大きく変わってしまうからです。
それでも、設計時にはある程度見積もれないと、特に組み込み系の場合はROMサイズが足りるかどうかあらじめ知っておかないとまずいので、私なら既存の似たようなプログラムのmapファイルを参照します。既存のプログラムの論理コード行数を計測し、mapファイルから各メモリセグメントのサイズを取得しておけば、「このコンパイラならソースコード何行で大体これくらいROM、RAMを使う」という目安に使えます。Visual C++でもmapファイルは生成されるので、Borland C++でも生成されるんじゃないかと思います。
参考
http://www.mnc.co.jp/INtime/user/intimedev.php?M …
No.2
- 回答日時:
「プログラム領域の算出を関数ごとに行う」のですから、単純に「その関数の中身がある時と、中身がない時の、プログラムサイズを比較すれば良い」のです。
例えば、UserFunc01()関数のコードサイズを調べる場合は
bool UserFunc01(int par1,char par2)
{
#if 0
int i,j;
char buf[256];
char *p;
p=buf;
(中略)
return TRUE;
#endif
}
として「#ifを用いて中身をすべて無視させる」ようにしてプログラムを作ります。そして、出来上がった「実行ファイル」のファイルサイズを調べます。
例えば、135785バイトだったとしましょう。これが「UserFunc01が空っぽだった時のサイズ」です。
次に「#if」を外し
bool UserFunc01(int par1,char par2)
{
int i,j;
char buf[256];
char *p;
p=buf;
(中略)
return TRUE;
}
にしてから、普通にプログラムを作ります。そして、出来上がった「実行ファイル」のファイルサイズを調べます。
例えば、137922バイトだったとしましょう。これが「UserFunc01があった時のサイズ」です。
差は「137922-135785=2137」で、2137バイトです。
つまり「UserFunc01があると、プログラム領域が2137バイトほど増える」と言う事です。
但し、この増えた2137バイトの中には「リテラルな文字列」や「ライブラリで増えた分」や「増えた分のリロケーション情報」も含まれますから、2137と言う数字は「純粋に、命令コードだけで増えたバイト数」ではありません。
ともかく「UserFunc01があると、プログラム領域が2137バイトほど増える」と言う事だけは確実です。
このように「中身がある時と、中身がない時の差」を調べれば「特定の、ある1つの関数が使用する、プログラム領域のサイズ」が判ります。
なお「ある特定の1つの関数が、実数を返す数学ライブラリのような、大規模なサイズのライブラリ関数群を呼んでいる」と言う場合、その関数があるとないとでは「大規模なサイズのライブラリを組み込むか、組み込まないか」と言う大きな差になる事がありますので「関数1つでプログラム領域のサイズが2倍に」などと言う事もあります。
No.1
- 回答日時:
「プログラム領域」の意味が「翻訳後のコード部分のみのBYTE数」
の意味なら、これは設計時には決定できませんし、CでなくC++の
場合だと予測すら不可能となります。確実に行うには、プログラム
完成後に調査することになります。
また「ヒープ領域」が実行時の動的確保メモリーの実効的BYTE数
であれば、これも設計時の確保量と実際に使用される量が異なり
ます。同じプログラムの同じコードであっても、その時のOSの
コンディションによって異なる場合があります。
従って「プログラム領域」の欄には「原理的に設計不能」と
書きましょう。また、うそを書いてはいけないので、
「ヒープ領域」の値には必ず「約」をつけましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 【CASLプログラム】 定数(80と55)を確保し、その和をGR1に、その差をGR2に求めるCASL 1 2022/12/16 01:17
- C言語・C++・C# あまりわかりません。 複素数$c$を具体的に定めた複素写像写像$f_c(z)$に対して、原点を含む領 4 2022/10/25 09:17
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- その他(ブラウザ) bingチャットの内容(縦長)をスクリーンショットで保存する方法 3 2023/02/28 02:13
- 物理学 電界がE=c(y^2z^3i+2xyz^3j+3xy^2z^2k)と与えられた場合(E.i.j.kは 1 2022/08/01 14:07
- ノートパソコン パソコンを、アップグレードした後に出来た、Cドライブの後に出来た、このドライブは? 3 2023/04/03 17:10
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- Windows 10 【PC】デュアルディスプレイ利用時に2画面分で最大化できる? 3 2023/03/22 01:45
- ドライブ・ストレージ Win10を再インストールしたら、HDDの一部に未割り当て領域ができ何の操作もできません。 4 2023/05/19 05:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
メモリのセグメント違反の解決...
-
ちなみに、for (i = 0; str[i] ...
-
ファイルマッピング関数で失敗
-
GetAdapterInfoによりマックア...
-
マインスイーパ、自動解析プロ...
-
直接メモリにアドレス割付けで...
-
エクセル キャッシュメモリー...
-
メモリの解放の仕方
-
初心者過ぎる質問ですが、VRAM...
-
EXCEL-VBAにてADOのレコードセ...
-
マクロのスピードがダウンする??
-
再帰関数について
-
64bit C#アプリ メモリをたくさ...
-
メモリーリークエラーが起こる
-
関数内でVirtualAllocで確保し...
-
C言語 昇順・降順 ソート
-
メモリが不足しています(VBA)
-
C言語における再帰呼び出しの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
エクセルのメモリ使用状況/Appl...
-
sil_rew_memのメモリアクセスに...
-
メモリのセグメント違反の解決...
-
EXCEL-VBAにてADOのレコードセ...
-
C言語における再帰呼び出しの...
-
メモリが不足しています(VBA)
-
【C言語】再帰が時間がかかる...
-
メモリアロケーション異常の発...
-
エクセル キャッシュメモリー...
-
大容量のメモリ確保をスワップ...
-
ファイルマッピング関数で失敗
-
バッチファイルでの実行EXEのメ...
-
動的メモリとexit(C言語)
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
「memcpy」と「strcpy」について
-
LoadLibraryしたらFreeLibrary
-
C言語初心者です。debug assert...
おすすめ情報