• ベストアンサー

インラインについて

1つ教えていただきたいことがあるのですが、本で読んだのですが普通の関数とインラインの関数は短い関数の方だとインラインの方が早いと載っていたのですが、長いほうだと普通の関数の方が早いと載っていたのですが、なぜ長いほうだと普通の関数のほうがいいのでしょうか? わかる方いらしたらよろしくお願いします。

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

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

> 枠組みを超えた最適化が可能とはどういうことでしょうか? 簡単な例を挙げると... inline int f(int arg) {  return arg + 1; } というインライン関数があり、 a = f(5); のように呼び出すと、最適化によって、 a = 6; と展開できることを意味します。 これがインライン関数でなければ、必ず加算を実行しなければなりません。 > 例外が排出される可能性があるかどうかをコンパイラが把握できるとはどういうことなのでしょか? struct A {  ~A(); }; void f(); void g() {  A a;  f(); } とした場合、fの呼び出しによって例外が送出されるかもしれませんから、その際にaのデストラクタを呼び出せるようにするためのコードが挿入されます。 しかし、fがインライン関数で、かつ決して例外を送出しないことがコンパイラに分かれば、そうしたコードは不要になります。

79562
質問者

お礼

回答ありがとうございます。 後者はわかりました。 >inline int f(int arg) >{ > return arg + 1; >} >というインライン関数があり、 >a = f(5); >のように呼び出すと、最適化によって、 >a = 6; >と展開できることを意味します。 >これがインライン関数でなければ、必ず加算を実行しなければなりま >せん。 インラインだった場合、加算しなくてもよいと言うことでしょうか? あれ?でも加算してますよね? どういうときに加算しなくていいのでしょか?

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

その他の回答 (5)

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

> インラインだった場合、加算しなくてもよいと言うことでしょうか? > あれ?でも加算してますよね? > どういうときに加算しなくていいのでしょか? インライン関数の場合でも、加算しているといえばしていますが、それはコンパイル時の話であり、実行時に加算するわけではありません。

79562
質問者

お礼

インライン関数の場合はコンパイル時の話で普通の関数は実行時に加算されるのですか。わかりました。回答ありがとうございます。

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

処理系や文脈に相当依存します。 インライン関数が高速になる理由は以下の3点です。 1. 関数の呼出しに伴う処理(スタック操作、引数のコピー、分岐)を省ける。 2. 関数の枠組みを超えた最適化が可能になる。 3. 例外が送出される可能性があるかどうかをコンパイラが把握できる。 なお、大きなインライン関数でも、それを呼び出している箇所がプログラム全体で1箇所しかなければ、決して遅くなることはありません。

79562
質問者

お礼

回答ありがとうございます。1つ質問なのですが、枠組みを超えた最適化が可能とはどういうことでしょうか?勉強不足ですみません。

79562
質問者

補足

もう1つ教えていただきたいことがあるのですが、例外が排出される可能性があるかどうかをコンパイラが把握できるとはどういうことなのでしょか?本当に勉強不足ですみません。

全文を見る
すると、全ての回答が全文表示されます。
  • oldman50
  • ベストアンサー率29% (8/27)
回答No.3

 インライン関数が早いのは、関数の呼び出しや分岐によるオーバーヘッドを省くことができるからです。  たとえば、ある関数本体の処理にかかる実行時間が10で、その関数の呼び出しにかかるオーバーヘッド時間が10だとすると、インライン化して後者を省けば、全体の実行時間を半減させることができます。  しかし、関数本体の処理にかかる実行時間が1000だとすると、関数の呼び出し時のオーバーヘッドを省くことで得られる効果は、ほとんどありません。

全文を見る
すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

小さくても大きくてもインラインの方が実行速度は速いでしょう。 関数とのデータの受け渡しが減りますから。 ただ大きい場合その影響は全体に対して僅かでしょう。 逆にインラインにするとメモリーサイズが大きくなりますので仮想メモリーやキャッシュメモリーのヒット率が下がって実際の処理時間が延びるということはあるかも知れません。

全文を見る
すると、全ての回答が全文表示されます。
  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

インライン関数とは、コンパイル時にその関数を呼び出している部分を関数内のコードに置き換えることを行う特別な関数です。 普通の関数はコンパイルされると関数本体の実行コードが1つしか生成されません。そして、その関数が呼び出されるときはその1つしかない実行コードが呼び出されます。呼び出されるときは呼び出し元で使用しているローカル変数や引数、関数を実行した後に戻ってくる場所などをスタック領域に退避させます。 それに対してインライン関数は、コンパイルされるとその関数を呼び出している場所に、その呼び出している場所の数だけ関数本体の実行コードが作られます。インライン化された関数の実行コードはその関数を呼び出している場所にあるので、ローカル変数や引数、関数を実行した後に戻ってくる場所などをスタック領域に退避させる必要がなく、その分処理が早くなります。 しかし、呼び出される場所の数だけ、まったく同じ実行コードが何度も作られることになるのでメモリ効率が悪くなります。なので、関数が長い(=実行コードが大きい)場合はインラインにしない方が良いのです。

79562
質問者

お礼

回答ありがとうございます。簡単に言うとインラインは関数を呼び出すたびに呼び出されるけど、普通の関数は、一度だけ呼び出されて後からまた呼び出されるときはそこからまた呼び出しをするということでしょうか?

79562
質問者

補足

気になったので補足します。このインライン化された関数はメモリのどこの領域に行くのでしょか?

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

関連するQ&A

  • インライン関数

    インライン関数として認識されなくても、通常の関数として実行されるのなら、プログラムする際にはすべての関数にinlineと書けばいいと思います。 インライン関数を使えば実行速度が上がる。それなら何故コンパイラ側で通常の関数すべてをインライン関数として認識しないのかがわかりません。inlineと書く手間が省けるので。 lnline関数として認識しようとしたができず、通常の関数として実行する時は、通常の関数を普通に実行するときよりも実行速度が遅くなるのでしょうか?もし、遅くならないのならすべての関数をinline関数として書けばいいと思います。どうなんでしょうか?お願いします。

  • インライン展開でコンパイラが何をやっているのか知りたいです

    インライン展開すると、関数の呼び出しオーバーヘッドが小さくなることはわかるのですが、インライン展開した場合としていない場合と、なぜ関数呼び出しのオーバーヘッドがなくなるのかアセンブルレベルでの違いがよくわからないです。 関数をインライン展開した場合、コンパイラはどのようにコンパイルするのか、そしてその関数実行時の振る舞いがインライン展開なしの場合とどう違うのか、わからないので教えていただけませんか? 以上、よろしくお願いします。

  • 別ファイルのインライン関数コール

    インライン関数について質問です。 前提条件 __inlineで関数定義 インライン関数を別ファイルのソースファイルから呼び出すには、ヘッダファイルにインライン関数の実体を置いておく必要があることは分かっています。 そのインライン関数の実態をソースファイルに置き、コンパイルオプションの組み合わせによって、別ファイルからコールすることは可能なのでしょうか?

  • 再帰関数のインライン展開

    再帰関数のインライン展開は出来るのでしょうか? もし、出来るようならアセンブラではどのように表現されているんですか? C以外の言語でも、再帰関数のインライン展開が出来るプログラム言語があれば教えてください。

  • インライン入力について

    OS Xを使用していますが、Illustrator10で文字ツールを使用時にインライン入力出来なくなりました。インライン入力にするにはmacの方を設定すればいいのか、Illustrator10の方を設定すればいいのか、よく分かりません!どちらもインライン入力に出来るのであれば、インライン入力にしたいのですが、どこをどのように設定すればいいのか教えて下さい。よろしくお願いします。

    • 締切済み
    • Mac
  • インライン展開されているか確認する方法

    VisualStudioを使用しています。 タイトルの通り、関数がインライン展開されているかどうかを確認したいのですが、何か方法はあるのでしょうか? void func(){ int a = 0; } void main(){ func(); } 例えば、上のコードで関数func()がインライン展開されてるかどうかを知りたいと思います。 どうかよろしくお願いします。

  • インラインのアイライン

    こちらで目力を出すためにはインラインにアイラインを引くのが一番、というような事を見たのですが、コンタクトレンズをしていてもインラインにアイライン入れても大丈夫なのでしょうか?

  • インラインで回答?

    メールでの質問の中で、「インラインで回答します」と書かれているのがありますが、インラインで回答するというのはどういうことでしょうか? ひょっとして、私の会社だけ? 教えてください。

  • クラス メンバ関数インライン化

    クラス内でメンバ関数を定義するとインライン関数になると書いてあったのですが、全てクラス内でメンバ関数を定義してはだめなのでしょうか?   クラス外でメンバ関数を定義するメリットを教えてください。 教えてくださいm(_ _ )m

  • Macのインライン入力について

    Macのインライン入力について 使用機種はiMac G4 OSX 10.4.11 & 9.2.2 です。 クラシック環境でノートパッドへのインライン入力はできないのでしょうか? シンプルテキストではインライン入力ができます。 ノートパッドでも前にできたような気がするのですが…、 私の勘違いでしょうか。 曖昧な質問で申し訳ありませんが、はっきりご存知の方がいましたら 教えていただければ助かります。よろしくお願いします。

    • ベストアンサー
    • Mac