はい、インライン関数は通常ヘッダーに配置されるため、関数が使用されるすべての場所で関数本体がコンパイラーに直接表示されます。これにより、コンパイラは、特定のインスタンスで関数のインラインコードを生成するかどうかを評価できます。
これは基本的には発生しません。「インライン関数は、それがodrで使用されるすべての変換単位で定義される必要があります。」(§3.2/ 3)。つまり、コンパイラが関数をインラインで生成する場合、ライブラリに入るのは、その関数のコードのインライン展開を含むオブジェクトコードです。関数は使用するたびにインラインで展開されない可能性があるため、通常はライブラリに関数の定義もありますが、その定義は(少なくとも主に)通常の関数のように使用され、インラインで展開されません。
ただし、リンカーはコードを生成することもできます。関数が言語標準による関数であるかどうかに関係なく、inline
使用されているものと同じまたは異なる翻訳単位で定義されている場合でも、リンカはその関数のインラインコードを生成できる可能性があります。
簡単に言うとinline
、関数のコードがインラインで生成されるかどうかに関しては、キーワードは一般的なコンパイラにほとんどまたはまったく影響を与えません。主な(唯一ではないにしても)効果は、単一定義規則を変更することです。インラインであるということは、同じ関数の複数の(同一の)定義が問題を引き起こすことなく存在できることを意味します。