2011-07-21 14 views
2

可能性の重複:
When should I write the keyword 'inline' for a function/method?インライン関数はいつ使用しますか?

私は、C++でのインライン関数について質問があります。 インライン関数は、各関数をインライン関数本体に置き換えるために使用されています。 しかし、いつ使用するのか分かりません。インライン関数はパフォーマンスを向上させることができると言われていますが、インライン関数の使用をいつ考えるべきですか?

+0

"インライン関数はパフォーマンスを改善できますか?" – razlebe

+0

'' inline'関数は性能を向上させるか、または傷つけることがありますので注意してください。 –

+0

あなたはそれについて心配していません。コンパイラが処理します。 – cppcoder

答えて

2

現代のコンパイラのほとんどは、インライン関数の最適化を適用するのに十分なほどスマートです。おそらくコンパイラに決定させるのに最適です。

インラインは単なる提案に過ぎず、コンパイラはそれを拒否または適用することは自由です。
あなたは場合、関数をインラインにすることを検討してください:

  • 機能が小さいあなたが代わりに#define
+0

私はいつそれを使うべきだと思いますか –

+2

あなたはそうしません。コンパイラはあなたが書いたすべてのインライン・キーワードを喜んで無視し、それがより良いと考えるならば独自のことを行います。 – R4D4

+0

@Als私が知る限り、コンパイラがインライン化できるようにするためには、関数ファイルをヘッダファイルに残しておく必要があります(他の場所で定義された関数をインライン化できません)。まだそれは本当ですか? –

2

は通常、現代のコンパイラは、特定のインライン化するのに十分なインテリジェントですpreprocssorディレクティブのインライン関数を使うことができます

  • 小さな関数が限界まで(スペースの増分で)。あなたはヒントを提供することができます。もちろん、あなたは inlineコールのオーバーヘッドを節約する、小さな繰り返し機能になります。

    inlineキーワードを指定しても、コンパイラはその関数をインライン化しないようにすることがあるため、(最適化のために)少なくともいくらか参考にしてください。

    3

    インライン関数は、パフォーマンスクリティカルでどこでも再利用される小規模なスタブのコードに最適ですが、書くのは簡単です。

    しかし、これらを使用してコードを分割することもできます。そのため、1000行の長い関数ではなく、100行の長さのメソッドに分割することができます。これらをインライン化すると、1000行のlongメソッドと同じ効果が得られます。

    最近のコンパイラは自動的に小さなメソッドの一部をインライン展開しますが、手動でより大きなものを手動でインライン展開することはできます。

    このことについて多くのリソースは、例えば、あります

    1

    あなたが繰り返されていることを考えるときには、インライン関数を使用する必要があります関数への呼び出しにはより多くの時間がかかります関数の本体をメインコードの中に置くだけです(言い換えれば、関数の本体が小さく、関数が繰り返し呼び出されるとき)。しかし、コンパイラは一般にコードを最適化し、インラインとして定義された関数を無視することがあります。 SOにはこれをさらに詳しく扱う多くのスレッドがあります。

    2

    inlineキーワードの目的は、複数のコンパイル単位で同じ関数を定義できるようにすることです(通常、複数のソースファイルからインクルードされたヘッダーファイルで定義します)。いくつかのコンパイラでは、コンパイラが複数のコンパイル単位でインライン展開するためにコンパイラを考慮できるようにするには、これが不可欠です。

    したがって、ヘッダーファイルに関数を定義する場合は、常にinlineと宣言する必要があります。そうしないと、ファイルが複数のソースファイルに含まれているとリンクエラーが発生します。 (クラスメンバ関数の場合は、代わりにクラス内で定義することができます;それは暗黙的にinlineと宣言します)。ソースファイルで定義した場合、好きな場合はインライン展開に適していると思われる場合はinlineと宣言することができます(小さければ、1か所から呼び出されるなど)。

    しかし、コンパイラは一般的に、あなたの機能よりも優れたアイデアを持っていると思います。いくつかはヒントとしてinline宣言を受け取り、他の人はそれを完全に無視するかもしれません。一部の関数は、関数を強制的にインライン化する(またはインライン化しない)非標準の拡張を提供することもあります。賢明でないインライン展開がパフォーマンスを損なう可能性があるので、コンパイラの決定よりも改善が得られることを(測定によって)確かめているものだけを使用してください。

    0

    これまでに言われていたことは全て正しいと言われましたが、パフォーマンスについて話して以来、よくある間違いについて警告したいだけです。

    一部のプログラマーは、関数呼び出しのオーバーヘッドが節約されるため、「インライン」がより速くなると誤って考えると考えています。はい、オーバーヘッドが節約されますが、インライン関数が関数呼び出しより大きなコードにコンパイルされた場合(非常に迅速に発生します)、コード全体が大きくなります。その後、コードがプロセッサキャッシュに収まらない可能性が高くなります。あなたの "インライン"コードは実際にはもっとゆっくり実行されます。

    "インライン"の使用は、.hで直接書かれた簡単なゲッター/セッター関数でのみOKです。

    その他の場合は、「インライン」を使用せずに、コンパイラに決定させることをお勧めします。

    一般的なアドバイス:一般的な概念とは別に、すべてを実行するまで最適化について考えるべきではなく、どの操作に処理時間がかかるかを測定できます。それは通常、コードの20%未満なので、他のすべてを最適化するためにあなたの時間を盲目的に無駄にしません。そして、測定では、最適化(ここではいくつかのインラインを追加するなど)が実際に機能するかどうかをすぐに確認することができます。

    関連する問題