記録を正すために、この基本的な質問をしています。この質問と現在受け入れられている回答を参照しましたが、説得力がありません。ただし、2 番目に投票数の多い回答は、より良い洞察を提供しますが、完璧でもありません。
inline
以下を読みながら、キーワードと「インライン化」の概念を区別してください。
これが私の見解です:
インライン化の概念
これは、関数の呼び出しオーバーヘッドを節約するために行われます。これは、マクロ スタイルのコード置換に似ています。異論の余地はありません。
inline
キーワード_
知覚A
inline
キーワードは、通常は小さな関数に使用されるコンパイラへの要求であるため、コンパイラはそれを最適化し、より高速な呼び出しを行うことができます。コンパイラはそれを自由に無視できます。
以下の理由により、私はこれに異議を唱えます。
inline
より大きな再帰関数はインライン化されず、コンパイラはキーワードを無視します。- 小さい関数は、
inline
キーワードが言及されているかどうかに関係なく、オプティマイザーによって自動的にインライン化されます。
ユーザーがキーワードを使用して関数のインライン化を制御できないことは明らかですinline
。
知覚B
inline
インライン化の概念とは何の関係もありません。インライン化されているため、大きな/再帰関数を前に置いinline
ても役に立たず、小さな関数は必要ありません。の唯一の決定論的な使用法は、 One Definition Rule
inline
を維持することです。
つまり、関数がで宣言されている場合、inline
以下のもののみが義務付けられています:
- その本体が複数の翻訳単位で見つかった場合でも (たとえば、そのヘッダーを複数の
.cpp
ファイルに含める場合)、コンパイラは 1 つの定義のみを生成し、複数のシンボル リンカー エラーを回避します。(注: その関数の本体が異なる場合、それは未定義の動作です。) - 関数の本体は、
inline
それを使用するすべての翻訳単位で表示/アクセス可能でなければなりません。つまり、あるファイルで関数を宣言してinline
定義.h
すると、他のファイルで「未定義のシンボル リンカ エラー」が発生します。.cpp
.cpp
評決
「A」の認識は完全に間違っており、「B」の認識は完全に正しいです。
これについて標準でいくつかの引用がありますが、この評決が真か偽かを論理的に説明する答えを期待しています。