- ベストアンサー
関数の前にある staticやinlineの意味?
関数の先頭に static inline なし の3パターンがありますが、そのうちなしは普通の関数、inlineは、マクロのように展開?する関数と理解していますが、関数にstaticをつけるのは何の効果を狙っているものでしょうか? inlineは呼び出しを減らす?効果だと思いますが、C言語は結構奥が深いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
static(C/C++) 使われ方によって意味が違います。 関数につける場合:他のファイルから参照できなくなります。 メンバ関数につける場合:ほぼ関数と同じ扱いになります。つまりthis等が使えないしstatic以外のメンバは呼べませんがスコープはそのままです。(C++) メンバ変数につける場合:すべてのインスタンス共有になります。(C++) 関数内の変数につける場合:ヒープに領域がとられ、毎回同じ部分が参照されます。 グローバル変数につける場合:他のファイルから参照できなくります。 inline(C++) インライン展開されます。 インライン展開とはマクロ関数に近いですが、関数やメンバ関数と同じように書けます。 一般的に インライン展開すると、関数呼び出しによるオーバーヘッドがなくなるので 実行速度ははやくなりますが、実行ファイルのサイズが増えます。 またinline指定しなくてもコンパイラの最適化の設定によっては 勝手にinline展開されます。
その他の回答 (3)
- xanadou
- ベストアンサー率47% (10/21)
まず確認ですが、「関数」で「C言語(C++ではなく)」ですよね? 下の方達の回答には「変数」「C++」に関するものが混じっているようなので注意してください。 inlineに関するご理解は問題無いかと思われます。 「関数にstatic」ですが、「スコープを同ファイル内に限定する」という指定です。 要するに、「その関数を呼べるのは、同じファイル内の他の関数からだけになる。」ということですね。
- crew21
- ベストアンサー率26% (58/222)
staticについて言うと、メモリ上に一つしかオブジェクトが存在しないということです。 例えば(細かい文法話は抜きにしてね)、 class ABC { static int aaa; int bbb; } とした場合、 ABC *abc1 = new ABC(); ABC *abc2 = new ABC(); ABC *abc3 = new ABC(); などというように、このクラスのインスタンス(オブジェクト)を複数個作ってゆくと、bbbは作った数だけメモリ上に確保されます。 即ちbbbという名前のint型変数が、異なるメモリ領域に割り当てられるわけです。即ち名前は同じですが、全て別物です。 こういう変数をインスタンス変数と言ったりもします。 対してaaaはそのクラスに一つしか存在しないので、どんなにそのクラスのインスタンスを作っても、一つしか存在しません。 言い方を変えると、インスタンスを作る必要がありません。 使われ方としては、複数のインスタンス間の共有メモリ的な感じです。 こういう変数をクラス変数と言ったりします。
- SAYKA
- ベストアンサー率34% (944/2776)
static http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=c%E8%A8%80%E8%AA%9E%20static inline http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=c%E8%A8%80%E8%AA%9E%20inline それぞれの説明によって 質問者が判りやすい判りにくいがあるからどれか適当なやつを読んでね。