インライン関数とは、コンパイラが関数の呼び出しを直前にコードを挿入することで置き換えることができる(しかし義務ではない)関数です。これを実現するためにはinlineキーワードが使用されます。
inlineキーワードはコンパイラへのヒントを提供しますが、義務ではありません。関数が複雑すぎる場合、無視されることがあります。制限とリスク:
例:
inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() はインラインとして扱われます
質問: inlineキーワードは、関数がすべての呼び出しポイントで埋め込まれることを保証しますか?
回答: いいえ。コンパイラは内部のヒューリスティックに基づいて、インライン関数を挿入する決定を行います。inlineはあくまで推奨です。
ストーリー
財務システムに頻繁に使用されるロガーが多数の大きなインライン関数と共に実装されました。システムが成長するにつれ、バイナリのサイズが何倍にも増加し、リンク時間が増加し、サーバー上のキャッシング効率が低下しました。
ストーリー
クロスプラットフォームソフトウェアを移行中に、一部のコンパイラ(例えば、MSVCとGCC)がインラインを異なる方法で処理していることを発見しました。その結果、関数の一部がインライン展開されず、他の部分は逆に展開され、プラットフォーム間でアプリケーションの速度やサイズの再現困難な違いを引き起こしました。
ストーリー
開発者はインライン関数をヘッダーファイルにのみ宣言しましたが、実装は別のcppファイルに持ち出しました。その結果、リンク時にmultiple definitionまたはunresolved externalのエラーが発生しました。インライン関数はヘッダー内で定義される必要があります。