クラス定義で定義されている場合にメンバー関数が暗黙的にインライン化されるのと同様に、次のフリー関数は C++ で暗黙的にインライン化されますか?
void func() { ... }
テンプレート関数は同じように動作しますか?
インライン化の意味によって異なります。コンパイラは、発行されたコードを呼び出しサイトにインラインで配置することにより、任意の関数を最適化できます。ただし、あなたが尋ねるコードは、宣言されているかのように動作しますか?
inline void func() { ... }
答えはノーです。コードを 2 つの異なるコンパイル ユニットに配置して実行可能ファイルをビルドすると、複数の定義エラーが発生します。関数を明示的に「インライン」としてマークすると、そうはなりません。
テンプレート関数に関しては、コンパイル システムの一部が、同じテンプレートの複数のインスタンス化によって複数の定義エラーが発生しないようにします。
いいえ、暗黙的にインライン化されているわけではありません。コンパイラは、別のモジュールがこの関数を使用するかどうかを知る方法がないため、コードを生成する必要があります。
これは、たとえば、ヘッダーでそのような関数を定義し、ヘッダーを 2 回含めると、複数の定義に関するリンカー エラーが発生することを意味します。明示的inline
に修正します。
もちろん、効率的であると判断した場合、コンパイラは関数をインライン化する可能性がありますが、明示的なインライン化とは異なります。
inline
テンプレート関数は、複数の定義エラーを防ぐために を必要としないという意味で、暗黙的にインライン化されます。コンパイラがそれらをインライン化することを強制されているとは思いませんが、よくわかりません。
コンパイラがインライン化するかどうかに応じて、インライン化される場合があります。