38

記録を正すために、この基本的な質問をしています。この質問現在受け入れられている回答を参照しましたが、説得力がありません。ただし、2 番目に投票数の多い回答は、より良い洞察を提供しますが、完璧でもありません。

inline 以下を読みながら、キーワードと「インライン化」の概念を区別してください。

これが私の見解です:

インライン化の概念

これは、関数の呼び出しオーバーヘッドを節約するために行われます。これは、マクロ スタイルのコード置換に似ています。異論の余地はありません。

inlineキーワード_

知覚A

inlineキーワードは、通常は小さな関数に使用されるコンパイラへの要求であるため、コンパイラはそれを最適化し、より高速な呼び出しを行うことができます。コンパイラはそれを自由に無視できます。

以下の理由により、私はこれに異議を唱えます。

  1. inlineより大きな再帰関数はインライン化されず、コンパイラはキーワードを無視します。
  2. 小さい関数は、inlineキーワードが言及されているかどうかに関係なく、オプティマイザーによって自動的にインライン化されます。

ユーザーがキーワードを使用して関数のインライン化を制御できないことは明らかですinline

知覚B

inlineインライン化の概念とは何の関係もありません。インライン化されているため、大きな/再帰関数を前に置いinlineても役に立たず、小さな関数は必要ありません。

唯一の決定論的な使用法は、 One Definition Ruleinlineを維持することです。

つまり、関数がで宣言されている場合、inline以下のもののみが義務付けられています:

  1. その本体が複数の翻訳単位で見つかった場合でも (たとえば、そのヘッダーを複数の.cppファイルに含める場合)、コンパイラは 1 つの定義のみを生成し、複数のシンボル リンカー エラーを回避します。(注: その関数の本体が異なる場合、それは未定義の動作です。)
  2. 関数の本体は、inlineそれを使用するすべての翻訳単位で表示/アクセス可能でなければなりません。つまり、あるファイルで関数を宣言しinline定義.hすると、他のファイルで「未定義のシンボル リンカ エラー」が発生します。 .cpp.cpp

評決

「A」の認識は完全に間違っており、「B」の認識は完全に正しいです。

これについて標準でいくつかの引用がありますが、この評決が真か偽かを論理的に説明する答えを期待しています。

4

2 に答える 2