
No.4ベストアンサー
- 回答日時:
>組込み系のプログラムで考えています。
>この場合だと、メモリがかなり限られてくるのではないかと思います。
この場合も下はPICぐらいから上はSH4とか(別にSH4が最上って分けじゃないですが)までマイコン毎にRAM(メモリ)の量は千差万別です。
PICだとローカル変数にループ変数以外を使うの自体、言語道断ですし。
メモリが多くても大半が外部メモリだった場合、内部メモリのスタックを使った方が高速化できるので、わざとスタックを使ったりします。
要はケースバイケースで、こうしておけばすべて問題ないという話ではありません。
>この場合でも、根っこ(TOP)の階層ではあまりローカル変数を使用しない方が良いのでしょうか??
それは、もう設計レベルの問題です。
使用するマイコンのメモリ量やスタックに使用できる量から最初にある程度予想して設計しておくべきことで、使用するマイコンやソフトの規模が分からないのでは、断言できません。
mainに限って言えば、動的変数でも静的変数でもメモリ消費という面に関しては同等ですが、SUB側でのメモリ消費は動的変数と静的変数では大きく違ってきます。
なぜなら静的変数は、メモリをコンパイル時で確保するため常に消費してしまいますが、動的変数であれば動的に積み重ねた最大値までしかメモリを消費しないためです。
少ないメモリでギリギリで動かす場合は、動的変数でメモリを節約しないと収まらない場合も出てくることがあります。
それこそメインプログラマーの設計力の見せ所ですよ。
心配なら本格的な開発の前に使用するメモリ量だけの本物に近いテストプログラムで動かして使用最大スタック量を計測してみれば済む話でしょう。
No.3
- 回答日時:
コンパイラと実行する環境に依存する問題ですが、Windowsであれば巨大な配列等をローカル変数にしない限り気にしなくても良いように思います。
小さなローカル変数であれば、レジスタなどに割り当てられることもありますので、コンパイラに任せたほうが実行効率の良いコードが出ます。
stasicを使う場合は、初期値が必要な場合に限定したほうが他人がコードを読んだとき意図不明なstaticで混乱させる可能性もあります。
ようは、
・スタックオーバーする可能性が低いなら気にしなくて良い。
・処理依存でstaticにする理由が無い限り気にしない。
・初期値があるならstaticにしておく。
ってところですか。
この回答への補足
補足ですが、
組込み系のプログラムで考えています。
この場合だと、メモリがかなり限られてくるのではないかと思います。
またもう一点追加質問ですが、
main関数だけではなく、階層が深くなっているモジュールで
いくつの何の関数を使っているのか分からない場合(こんなものは設計がなっていない!と感じますが・・)
この場合でも、根っこ(TOP)の階層ではあまりローカル変数を使用しない方が良いのでしょうか??
よろしくお願いします。
No.2
- 回答日時:
> プログラムを終了するまで、ローカル変数は解放されないように思います。
> なので、プログラム実行中は常にスタックに積んである状態になってしまいます。
>
> この場合main関数内の変数は静的変数にするのが望ましいのですか??
静的変数にすれば、プログラムが終了するまで解放されません。
また、ローカル変数というか自動記憶域期間を持つオブジェクトがスタックに割り付けられるかどうかは処理系に依存します(確かにスタックを使う場合がほとんどですが)。
自動記憶域のサイズも、静的記憶域のサイズも、完全に処理系に依存しますので、どちらが望ましいかは一概にはいえません。
No.1
- 回答日時:
★ループ内でスタックを大量に使うのなら。
・特にループ内でスタックを大量に使う必要がない場合はどちらでも。
大量にスタックを必要として main() のローカル変数も配列とかが大きいのなら
static キーワードをつけた方がスタック領域がお徳かも。
・よってループ内でスタックの使われ方(量)によりますが、普通に使っている場合は
特に問題はないと思います。けどね。スタックがあまり取れない場合は main() の
ローカル変数は static キーワードを付けておきましょう。
・以上。上記の参考にして判断してみて下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語のwhileを含む関数について 2 2022/12/16 12:28
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
大容量のメモリ確保をスワップ...
-
ファイルの読み込みが遅い
-
ちなみに、for (i = 0; str[i] ...
-
メモリアロケーション異常の発...
-
循環参照を開放する理由に関して
-
エクセルのメモリ使用状況/Appl...
-
GetAdapterInfoによりマックア...
-
メモリがどんどんなくなっちゃ...
-
VBAの配列サイズとメモリに関して
-
【C言語】再帰が時間がかかる...
-
C言語における再帰呼び出しの...
-
メモリ内をトレースログに吐きたい
-
バッチファイルでの実行EXEのメ...
-
malloc関数の使い終わった後の...
-
これて逆じゃないですか?
-
ファイルマッピング関数で失敗
-
メモリ不足
-
C言語:関数のメモリ上でのサイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
ExitProcessの関数コールについ...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルVBA 大容量CSVファイル...
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
Bitmapを重ね合わせる方法
-
ルネサスマイコン(R8C) ビルド...
-
C,C++プログラムの強制終了時の...
-
C言語:関数のメモリ上でのサイ...
おすすめ情報