gccからの興味深い説明:インライン関数はマクロと同じくらい高速です:
一部の呼び出しは、さまざまな理由で統合できません(特に、関数の定義の前にある呼び出しは統合できず、定義内の再帰呼び出しも統合できません)。統合されていない呼び出しがある場合、関数は通常どおりアセンブラコードにコンパイルされます。プログラムがそのアドレスを参照する場合も、インライン化できないため、関数は通常どおりにコンパイルする必要があります。
関数定義での特定の使用法により、インライン置換に適さなくなる可能性があることに注意してください。これらの使用法には、varargsの使用、allocaの使用、可変サイズのデータ型の使用(Variable Lengthを参照)、計算されたgotoの使用(値としてのラベルを参照)、非ローカルgotoの使用、および入れ子関数(入れ子関数を参照)があります。-Winlineを使用すると、インラインとマークされた関数を置き換えることができなかった場合に警告が表示され、失敗の理由が示されます。
ISO C ++で要求されているように、GCCは、クラスの本体内で定義されたメンバー関数が、inlineキーワードで明示的に宣言されていない場合でも、インラインとしてマークされていると見なします。これは-fno-default-inlineでオーバーライドできます。C++ダイアレクトを制御するオプションを参照してください。
次のように、関数に `always_inline'属性を指定しない限り、GCCは最適化しないときに関数をインライン化しません。
/* Prototype. */
inline void foo (const char) __attribute__((always_inline)); The remainder of this section is specific
GNUC90インライン化に。
インライン関数が静的でない場合、コンパイラは他のソースファイルからの呼び出しがある可能性があると想定する必要があります。グローバルシンボルはどのプログラムでも一度しか定義できないため、他のソースファイルで関数を定義してはならず、その中の呼び出しを統合することはできません。したがって、非静的インライン関数は常に通常の方法でそれ自体でコンパイルされます。
関数定義でinlineとexternの両方を指定すると、定義はインライン化にのみ使用されます。アドレスを明示的に参照している場合でも、関数が単独でコンパイルされることはありません。このようなアドレスは、関数を宣言しただけで定義しなかったかのように、外部参照になります。
インラインと外部のこの組み合わせは、ほとんどマクロの効果があります。これを使用する方法は、これらのキーワードを使用して関数定義をヘッダーファイルに配置し、定義の別のコピー(inlineとexternがない)をライブラリファイルに配置することです。ヘッダーファイルの定義により、関数へのほとんどの呼び出しがインライン化されます。関数の使用が残っている場合は、ライブラリ内の単一のコピーを参照します。