重複の可能性:
インライン関数を使用する場合と使用しない場合は?
どのような条件下で関数をインライン化できない(すべきではない)のですか(C ++のみ)?
私が知っている2つの条件は次のとおりです。
1。関数に再帰呼び出しがある場合
2。関数に静的変数がある場合
重複の可能性:
インライン関数を使用する場合と使用しない場合は?
どのような条件下で関数をインライン化できない(すべきではない)のですか(C ++のみ)?
私が知っている2つの条件は次のとおりです。
1。関数に再帰呼び出しがある場合
2。関数に静的変数がある場合
inline
はC++のキーワードですが、インライン化はコンパイラのバックエンドによって実行される一般的なプロセスであり、通常は命令シーケンスがすでに生成された後に実行されます。
ACコンパイラは関数もインライン化し、C++コンパイラはそうでない関数をインライン化しますinline
。inline
C ++コンパイラは、任意の理由で関数をインライン化できない場合もあります。このキーワードは、関数が異なる変換単位(ソースファイル)に複数の同一の定義を持つ可能性があることを指定するために実際に存在します。
静的変数は、何かをインライン化できるかどうかには特別な関係はありません。おそらく、一部のコンパイラは、結果として得られるグローバル変数参照の構造をリンクするのが困難ですが、それは経験則というよりもバグです。
再帰関数もインライン化できます。再帰呼び出しはブランチに変換する必要があります。次に、ループ展開によってブランチをターゲットにすることができます。
1キロバイトを超えるコードにコンパイルされる関数は、通常、インライン化されません。ただし、コンパイラは#pragma
、そのような場合にインライン化を強制するためのディレクティブまたはプラットフォーム固有の属性を提供する場合があります。
関数がインライン化されないようにする最大の要因は、コード生成時にそのソースがコンパイラーで使用できない場合です。リンク時の最適化により、DLLによって提供される関数であるかどうかextern
にかかわらず、関数をインライン化する可能性が開かれます。inline
ただし、それでもJITスタイルの実行エンジンを介して実行することができ、好きなランダムフラグメントをインライン化(スプライス)することができます。
関数をインライン化できない唯一の状況は、コンパイル単位に関数の定義がない場合です。それでも、リンクタイムオプティマイザによるリンクタイムのインライン化を妨げることはありません。
キーワードは実際には単なるヒントであることに注意してくださいinline
。コンパイラは、キーワードを使用して関数をインライン化しないことを選択し、キーワードを使用せずに関数をインライン化することを選択する場合があります。