- ベストアンサー
static 関数のメモリ使用量
会社で過去のプログラムを参考に新規開発を行っているものですが、 旧プログラムは関数宣言でstaticを使用しており、関数のカプセル化をしている。 旧プログラムをみならい、staticで関数を宣言したのですがレビュー時にstaticで関数を宣言した場合、 『メモリーを多く使用するのでは?』と質問されたのですが回答が見つかりません。 詳しい方教えていただけますか? プログラムはファイル分割されており、同一関数名は存在している。 コンパイラーはgccです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
関数の生存期間はすべて静的記憶域期間です。したがって、externをつけても static をつけても、何もつけなくてもメモリの使用量は一緒です。 参考文献 C言語によるプログラミング スーパーリファレンス編、オーム社、2000. 以下、参考文献より該当箇所を抜粋 ---------------------------------------------------------- 第26章 関数 (page 346) 26.1.1 関数の種類 (前略) なお、関数には自動記憶域期間のように、ある一定期間内だけ存在するという関数はありません。生存期間(10.4節)は、すべて静的記憶域期間です。 (以下略)
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
> ディスクの使用量の話でしょうか? > ちょっと違うような気が…。 gccというだけでプラットフォームが不明なので、ディスクが存在するかどうか分かりませんが... 次のようなケースを想定しています。 /* a.c */ static void f() { ... } void a() { f(); } /* b.c */ static void f() { ... } void b() { f(); } のように、あちこちでfの定義を行えば,それぞれのfは別の実体を持つことになります。結果としてプログラムサイズが増えます。 ヘッダファイルの中で内部結合の関数fを定義して、それをあちこちでインクルードした場合も同様です。
補足
自分が作ったプログラムは、ひとつのファイルが1つのタスクになっており、init()など名前が重複している関数があるため、jactaさんの想定されたコードと似た構造になっております。 その場合にstaticをつけた場合と無い場合では、メモリー使用量の差異はあるのかが質問の内容でした。説明不足でもうしわけない
- asuncion
- ベストアンサー率33% (2127/6289)
>#3さん ディスクの使用量の話でしょうか? ちょっと違うような気が…。
- jacta
- ベストアンサー率26% (845/3158)
まったく同じ関数をそれぞれの翻訳単位で定義しているのであれば、確かにプログラムサイズが増えます。
- asuncion
- ベストアンサー率33% (2127/6289)
関数をstaticにしたらメモリを食うという話は聞いたことがないですね。私の知識が不足しているのかもしれませんが…。 その質問をした人に、「あなたはなぜそのように思われましたか?」と質問し返すのは、立場的にありでしょうか?
補足
聞いてみました。『変数のstaticが常に値を保持してるので、関数の場合も常にメモリーに残り開放されないのでは?』とのことです。
お礼
求めていた回答です! staticをつけようがメモリ使用量は変わらないのですね ありがとうございました!!