• 締切済み

プログラム領域の算出方法

現在C言語でプログラミングの勉強(設計含む)をしているのですが、設計書の記載項目に「プログラム領域」「ヒープ領域」「スタック領域」の算出を関数ごとに行うというような記述がありました。 動的メモリ領域・スタック領域の算出方法は何とか調べたのですが、「プログラム領域」の算出方法がわかりません! 出来れば 1.プログラム全体のプログラム領域の算出方法 2.関数ごとのプログラム領域の算出方法 を教えて頂けないでしょうか? 勉強している環境 OS:WindowsXP コンパイラ:Borland C++ Compiler 5.5 よろしくお願い致します。

みんなの回答

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

設計するために、メモリ領域のサイズを見積もれという話なのですよね? 静的データ領域、スタック領域、ヒープ領域はおよそ見積もれますが、プログラム領域の見積もりは難しいと思います。というのは、コンパイラの最適化オプション一つでプログラム領域のサイズが大きく変わってしまうからです。 それでも、設計時にはある程度見積もれないと、特に組み込み系の場合はROMサイズが足りるかどうかあらじめ知っておかないとまずいので、私なら既存の似たようなプログラムのmapファイルを参照します。既存のプログラムの論理コード行数を計測し、mapファイルから各メモリセグメントのサイズを取得しておけば、「このコンパイラならソースコード何行で大体これくらいROM、RAMを使う」という目安に使えます。Visual C++でもmapファイルは生成されるので、Borland C++でも生成されるんじゃないかと思います。 参考 http://www.mnc.co.jp/INtime/user/intimedev.php?MAP%A5%D5%A5%A1%A5%A4%A5%EB%A4%AB%A4%E9%BA%C7%BE%AE%A5%D7%A1%BC%A5%EB%A5%B5%A5%A4%A5%BA%A4%F2%C1%DB%C4%EA%A4%B9%A4%EB

すると、全ての回答が全文表示されます。
回答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