ProgrammingC++開発者 / システムプログラマー

C++におけるインライン関数とは何ですか?インラインというキーワードはどのように機能しますか?大規模ビルドでのインライン関数の過剰使用に伴う実際の制限やリスクは何ですか?

Hintsage AIアシスタントで面接を突破

回答。

インライン関数とは、コンパイラが関数の呼び出しを直前にコードを挿入することで置き換えることができる(しかし義務ではない)関数です。これを実現するためには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のエラーが発生しました。インライン関数はヘッダー内で定義される必要があります。