2

C ++では、inlineキーワードで関数に注釈を付けることができます。私が理解していることから、これはコンパイラーに関数をインライン化するためのヒントを提供し(ただし義務はありません)、それによって小さな関数呼び出しのオーバーヘッドを回避します。

頻繁に呼び出されるメソッドがいくつかあるので、実際にはインライン化する必要があります。ただし、inline-annotated関数はヘッダーに実装する必要があるため、コードの配置が不十分になります。また、インライン化はコンパイラーの最適化であり、それが理にかなっているプログラマーに対して透過的に行われるべきだと思います。

それで、inlineインライン化を行うために関数に注釈を付ける必要がありますか、それともGCCは、-O3または他の適切な最適化フラグを使用してコンパイルするときに、注釈なしでこれを理解しますか?

4

2 に答える 2

3

inlineコンパイラへの単なる提案であることは真実ではなく、誤解を招く恐れがあります。関数をインラインでマークすることには、次の2つの影響が考えられます。

  1. 関数呼び出しが行われた場所にインラインで関数定義を代入する&
  2. 1つの定義規則による特定の緩和。ヘッダーファイルで関数を定義できます。

コンパイラは実行する場合と実行しない場合があります#1が、に従わなければなりません#2。したがって、インラインは単なる提案ではありません。関数がインラインとしてマークされたときに適用されるルールがいくつかあります。

inline一般的なガイドラインとして、最適化のためだけに関数にマークを付けないでください。最新のコンパイラのほとんどは、ユーザーの助けがなくても、これらの最適化を独自に実行します。inlineODRを壊さずに関数定義をヘッダーファイルにインクルードする唯一の正しい方法であるため、ヘッダーファイルに関数をインクルードする場合は、関数にマークを付けます。

于 2013-02-05T15:41:30.787 に答える
1

一般的な民間伝承では、gccは常に(いくつかのコストヒューリスティックに基づいて)何かをインライン化するかどうかを独自に決定します(コンパイラー/リンカーオプションによっては、リンク時にそうすることもできます)。これは、インラインヒントが無視されたことをgccが警告する-Winlineを使用しているときに時々観察できますが、多くの場合、理由が示されます。

何が起こっているのかを正確に知りたい場合は、おそらくそのソースコードを読むか、それを読んだ人の言葉を借りる必要があります。

于 2013-02-05T15:37:40.247 に答える