• 締切済み

main関数内のローカル変数について。

main関数内でローカル変数は使用しない方が良いのでしょうか? 例えばmain関数内でループ処理(無限ループ)を行なう場合、 プログラムを終了するまで、ローカル変数は解放されないように思います。 なので、プログラム実行中は常にスタックに積んである状態になってしまいます。 この場合main関数内の変数は静的変数にするのが望ましいのですか?? よろしくお願いします。

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>組込み系のプログラムで考えています。 >この場合だと、メモリがかなり限られてくるのではないかと思います。 この場合も下はPICぐらいから上はSH4とか(別にSH4が最上って分けじゃないですが)までマイコン毎にRAM(メモリ)の量は千差万別です。 PICだとローカル変数にループ変数以外を使うの自体、言語道断ですし。 メモリが多くても大半が外部メモリだった場合、内部メモリのスタックを使った方が高速化できるので、わざとスタックを使ったりします。 要はケースバイケースで、こうしておけばすべて問題ないという話ではありません。 >この場合でも、根っこ(TOP)の階層ではあまりローカル変数を使用しない方が良いのでしょうか?? それは、もう設計レベルの問題です。 使用するマイコンのメモリ量やスタックに使用できる量から最初にある程度予想して設計しておくべきことで、使用するマイコンやソフトの規模が分からないのでは、断言できません。 mainに限って言えば、動的変数でも静的変数でもメモリ消費という面に関しては同等ですが、SUB側でのメモリ消費は動的変数と静的変数では大きく違ってきます。 なぜなら静的変数は、メモリをコンパイル時で確保するため常に消費してしまいますが、動的変数であれば動的に積み重ねた最大値までしかメモリを消費しないためです。 少ないメモリでギリギリで動かす場合は、動的変数でメモリを節約しないと収まらない場合も出てくることがあります。 それこそメインプログラマーの設計力の見せ所ですよ。 心配なら本格的な開発の前に使用するメモリ量だけの本物に近いテストプログラムで動かして使用最大スタック量を計測してみれば済む話でしょう。

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

コンパイラと実行する環境に依存する問題ですが、Windowsであれば巨大な配列等をローカル変数にしない限り気にしなくても良いように思います。 小さなローカル変数であれば、レジスタなどに割り当てられることもありますので、コンパイラに任せたほうが実行効率の良いコードが出ます。 stasicを使う場合は、初期値が必要な場合に限定したほうが他人がコードを読んだとき意図不明なstaticで混乱させる可能性もあります。 ようは、 ・スタックオーバーする可能性が低いなら気にしなくて良い。 ・処理依存でstaticにする理由が無い限り気にしない。 ・初期値があるならstaticにしておく。 ってところですか。

1990san
質問者

補足

補足ですが、 組込み系のプログラムで考えています。 この場合だと、メモリがかなり限られてくるのではないかと思います。 またもう一点追加質問ですが、 main関数だけではなく、階層が深くなっているモジュールで いくつの何の関数を使っているのか分からない場合(こんなものは設計がなっていない!と感じますが・・) この場合でも、根っこ(TOP)の階層ではあまりローカル変数を使用しない方が良いのでしょうか?? よろしくお願いします。

すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> プログラムを終了するまで、ローカル変数は解放されないように思います。 > なので、プログラム実行中は常にスタックに積んである状態になってしまいます。 > > この場合main関数内の変数は静的変数にするのが望ましいのですか?? 静的変数にすれば、プログラムが終了するまで解放されません。 また、ローカル変数というか自動記憶域期間を持つオブジェクトがスタックに割り付けられるかどうかは処理系に依存します(確かにスタックを使う場合がほとんどですが)。 自動記憶域のサイズも、静的記憶域のサイズも、完全に処理系に依存しますので、どちらが望ましいかは一概にはいえません。

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★ループ内でスタックを大量に使うのなら。 ・特にループ内でスタックを大量に使う必要がない場合はどちらでも。  大量にスタックを必要として main() のローカル変数も配列とかが大きいのなら  static キーワードをつけた方がスタック領域がお徳かも。 ・よってループ内でスタックの使われ方(量)によりますが、普通に使っている場合は  特に問題はないと思います。けどね。スタックがあまり取れない場合は main() の  ローカル変数は static キーワードを付けておきましょう。 ・以上。上記の参考にして判断してみて下さい。

すると、全ての回答が全文表示されます。

関連するQ&A