• ベストアンサー

static 関数のメモリ使用量

会社で過去のプログラムを参考に新規開発を行っているものですが、 旧プログラムは関数宣言でstaticを使用しており、関数のカプセル化をしている。 旧プログラムをみならい、staticで関数を宣言したのですがレビュー時にstaticで関数を宣言した場合、 『メモリーを多く使用するのでは?』と質問されたのですが回答が見つかりません。 詳しい方教えていただけますか? プログラムはファイル分割されており、同一関数名は存在している。 コンパイラーはgccです。

質問者が選んだベストアンサー

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

関数の生存期間はすべて静的記憶域期間です。したがって、externをつけても static をつけても、何もつけなくてもメモリの使用量は一緒です。 参考文献 C言語によるプログラミング スーパーリファレンス編、オーム社、2000. 以下、参考文献より該当箇所を抜粋 ---------------------------------------------------------- 第26章 関数 (page 346) 26.1.1 関数の種類 (前略) なお、関数には自動記憶域期間のように、ある一定期間内だけ存在するという関数はありません。生存期間(10.4節)は、すべて静的記憶域期間です。 (以下略)

zeontora2
質問者

お礼

求めていた回答です! staticをつけようがメモリ使用量は変わらないのですね ありがとうございました!!

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> ディスクの使用量の話でしょうか? > ちょっと違うような気が…。 gccというだけでプラットフォームが不明なので、ディスクが存在するかどうか分かりませんが... 次のようなケースを想定しています。 /* a.c */ static void f() {  ... } void a() {  f(); } /* b.c */ static void f() {  ... } void b() {  f(); } のように、あちこちでfの定義を行えば,それぞれのfは別の実体を持つことになります。結果としてプログラムサイズが増えます。 ヘッダファイルの中で内部結合の関数fを定義して、それをあちこちでインクルードした場合も同様です。

zeontora2
質問者

補足

自分が作ったプログラムは、ひとつのファイルが1つのタスクになっており、init()など名前が重複している関数があるため、jactaさんの想定されたコードと似た構造になっております。 その場合にstaticをつけた場合と無い場合では、メモリー使用量の差異はあるのかが質問の内容でした。説明不足でもうしわけない

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

>#3さん ディスクの使用量の話でしょうか? ちょっと違うような気が…。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

まったく同じ関数をそれぞれの翻訳単位で定義しているのであれば、確かにプログラムサイズが増えます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

関数をstaticにしたらメモリを食うという話は聞いたことがないですね。私の知識が不足しているのかもしれませんが…。 その質問をした人に、「あなたはなぜそのように思われましたか?」と質問し返すのは、立場的にありでしょうか?

zeontora2
質問者

補足

聞いてみました。『変数のstaticが常に値を保持してるので、関数の場合も常にメモリーに残り開放されないのでは?』とのことです。

関連するQ&A

  • static宣言について

    現在、c言語とDXライブラリを使ってゲームを製作しています。 http://okwave.jp/qa/q8270456.html 前回、このような質問をさせていただき、原因らしき箇所を突き止める所までいきました。 と言いますのも、配列の要素を指定する箇所(分かり辛かったらすいません。要素数ではありません)に、static宣言された変数を入れるとなぜかプログラムが強制終了されてしまうのです。 加えて、DXライブラリのGetColor関数にも返ってきた色をStatic宣言された変数に格納すると、何故か指定された色と違う色が出てしまうことが分かりました。 なんとか、その関数が終わる度に値を格納したかったので、色々試しました。 直接Static宣言されていない変数を間に噛ませてみたり、同じcpp内にわざわざ別の関数を用意して、そちらでStatic宣言し、値を返してみたり、と色々とやったのですが上手くいきませんでした。 ****************************************** int hairetu[20]; Static int z = 0; int x = z-1+1 hairetu[x] = zahyouX; (static宣言された変数zでhairetu[]の[]内を指定しようとするとダメ) (上記のように意味のない計算をさせてstatic宣言されていない変数を間にかませてもダメ) ****************************************** 結局の所、別のcppを用意して、ただ一つのStatic変数を+1していくだけの関数をくみ上げた所、上手くいったのですが・・・。何故このような事が起きるのでしょうか。 Static宣言された変数の決まりごと、もしくは、このような状態になってしまった原因など、見当がつきましたら教えていただけると有難いです。よろしくお願いします。

  • Java main関数内でStatic変数使えない

    JavaのStatic変数について質問です。 Main関数の中でStaticな変数を定義しようとしたところ、 final修飾子しか使えませんというエラー文言が出ます。 Main関数内でわざわざStatic変数を使用する必要はないのですが、 出来ないと言われると何故だろうと思ってしまいます。 どなたかご説明いただけないでしょうか? -------------------------------------------------------------------- class Test { public static void main(String[] args) { // 宣言時Staticは使えなく、finalでしか定義できないとエラーが出る Static int test_val = 10; // 表示 System.out.println(test_val); } }

    • ベストアンサー
    • Java
  • Static Initializerについて

    JavaWorld Online - Javaの“常識”、“非常識” 第3回 http://www.javaworld.jp/technology_and_programming/-/27074-5.html 上記のURL内の記述によると 「static変数の初期化は、そのstatic変数を宣言する際、同時に行うことができます。しかし、宣言時ではなく、実行時に初期化したいというケースもあるでしょう。そのような場合に、この静的初期化子を使用します。」 とあり、宣言時の初期化とStatic Initializerを使用した場合でタイミングが異なると読み取れる記述があります。 が、意味がよく分かりませんでした。Date型を現在日付で初期化する簡単なプログラムで確認したのですが、同じタイミングで初期化されるように見えました。正確には変数が初期化された直後にStatic Initializerが動いてました。 そしてこの順番は(私のプログラムでは)インスタンス化する場合と、インスタンス化せずにstatic publicで定義しているクラス変数にアクセスする場合ともに結果は同じでした。 もしかしたらHPの記述が間違っているのかなーとも思いますがよく分かりません。 知りたいのは両者のタイミングの違いです。 Static Initializerについてご存知の方よろしくお願いします。 ※字数の関係から今回はソースを添付できませんでしたが、ご希望があれば質問の補足で添付します。

  • C言語のStatic変数について

    現在、C言語の勉強しながらゲームプログラムにチャレンジしています。 二つの関数で利用する変数を作りたかったので、Static宣言された変数を容易しました。 ですが、この変数、一度処理が終わると当面使わない変数なのです。 (ただし、処理途中は何度も呼び出されるので値は保持しなければいけません) よって、メモリ上に延々居座られるのが邪魔に思えて仕方ありません。 実際、大したことないだろうとは思うのですが。 このStaticで宣言された変数を、自分の好きなタイミングでメモリ上から解放するような処理はできませんか? もしくはメモリ上に居座ることのない処理の仕方などありましたら、 考え方を教えていただけるとうれしいです。よろしくお願いします。

  • 関数内の宣言について

    あまりオープンソース等を見たことがないのですが、できるだけ速度を上げたくて、代数を大量に使用する関数の場合 その中の変数にstaticを明確に書いておくと速くなるんじゃないかなと思ったんですが、 単純な処理なのでコンパイラが自動的に選択してるのかなとも思ったのですがどうするべきでしょうか。

  • ARMについて

    ARMを買ったときにWEBカメラモジュールつきの開発基盤を買ったんですけど、すでにコンパイラ済みで、そのままmakeすればWEBカメラを動かせるのはいいんですが、それでは意味がないと教師に言われ、そのカメラを別のマイコンに移植すると言う実験をしています そこで問題なのですが,すでにARM-Linux-gccでコンパイラ済みのプログラムを普通のgccに戻す手段はありませんか? またはARMを使ってgccにリンクするとか? コンパイラ済みのARM-Linux-gccを何らかの方法でgccに変えるとか? もし知っている人がいたら教えてください お願いします

  • gccコンパイラー

    今、gccでコンパイルするc言語のコンパイラーを探しています。 フリーでダウンロードできるいいコンパイラーはないでしょうか。 お勧めなどがありましたら教えてほしいです。 あと、C言語ではgccやbcc等のコンパイラーで プログラムソースの書き方容が変わったりするものなのでしょうか? 一応、ボーランド?のコンパイラーは持ってます。 ただ、今度OJTでUNIX環境のc言語開発の現場に行く事になり gccでコンパイルするもので勉強しとくようにいわれています。 宜しくお願いします。

  • C言語での変数宣言の場所

    今まで2年ほどJavaを使っていましたが、最近になってCを使う必要が出てきました。Cは大学の頃に授業で学んだ程度のレベルです。 それはさておき。 JavaやC++ではメソッド内のどの場所ででも、新たな変数を宣言して使用できますが、Cでは関数内の最初の方でしか宣言できないですよね? 先日、その事を意識せずに、Javaと同じように変数を関数の任意の場所で宣言しているようなCのソースを書き、gccでコンパイルしたところ、コンパイルが通ってしまいました。 その時のファイルは「.c」ファイルです。 このソースはC++のソースとして、コンパイラが認識してしまったのでしょうか?拡張子が「.cpp」ではなく「.c」のままでしたが、コンパイラは拡張子ではなく、ソースを読み込んでから、そのプログラムがCなのかC++なのか判断しているのでしょうか? いまいちピンと来ないので、どなたか解説お願いします。

  • gccでの分割コンパイルについて

    参考書に分割コンパイルの方法が書いてなかったので質問させていただきます。 現在3つのソースファイルがあります。 1.header.h (関数プロトタイプ宣言) 2.kansu.c  (関数の定義) 3.main.c  (main()関数) ここで、main.cがheader.hをincludeしています。 このときの分割コンパイルはどのようにしたら良いのでしょうか?Makefileを作成するのでしょうか? 自分自身分割コンパイルの経験はありません。 環境は Cygwinを使ってのWindows XP コンパイラはgcc もうひとつは Visual Studio.netを使っての環境です。

  • GDLで使用できる関数は?

    書籍の付録に付いていたベストテクノロジー社のGDL (H8/3052F用にカスタマイズされているそうです。) でH8のプログラミングを勉強中です。 難しいことはわかりませんので、このような 「即プログラムできる」ものを購入しました。 マイコン用ですからC言語の参考書にあるような関数は 全ては使えないものだと思っていました。 (ちなみにCCS社のPIC用のコンパイラで サポートされている関数はわずかなものでした。) ためしにSIN関数を使ってみたら、正しい値が得られ 使えました。 こうしてテストプログラムを作って確認すれば確実 だと思いますが、これでは時間がかかりすぎます。 どのような関数が使えるのかを知る「簡単な?」方法 がありましたら教えてください。 またSINを使用したとき、引数、関数の型を double,float(GDLにおける)いずれにしても同じ結果 が得られました。 このような場合、型についてどのように考える べきでしょうか? 御教授よろしく御願いします。

専門家に質問してみよう