C ++の前の宣言なしに定義されている場合はfree関数は、暗黙的にインライン化されていますか?
質問
クラス定義で定義されている場合メンバ関数は、暗黙的にインライン化されている方法と同様に、暗黙的にC ++でインラインに、次のフリー機能ですか?
void func() { ... }
テンプレート関数は、同じように振る舞うか?
解決
いいえ、それは暗黙的にインライン化ではないです。コンパイラが別のモジュールは、この機能を使用するかどうかを知る方法がありませんので、それはそれのためのコードを生成する必要があります。
これはヘッダにそのような関数を定義し、二回ヘッダーを含める場合、あなたは複数の定義についてのリンカエラーを取得すること、例えば、意味しています。明示的なinline
はそれを修正します。
もちろん、それはそれは効率的になると考えている場合、コンパイラは、まだ関数をインラインかもしれないが、それが明示的にインライン化と同じではありません。
テンプレート関数は、暗黙のうちに、彼らは複数の定義のエラーを防ぐためにinline
を必要としないという意味でインライン化されています。私は、コンパイラはどちらかそれらをインライン化することを余儀なくされたとは思わないが、私はよく分からない。
他のヒント
これは、インライン化によって、あなたが何を意味するかによって決まります。コンパイラは、呼び出しサイトでのその放出されたコードをインラインで配置することによって、任意の関数を最適化することができます。それが宣言されたかのようにしかし、あなたが意味する場合は、あなたが尋ねるコードを約振る舞うん:
inline void func() { ... }
そして、答えはノーです。あなたは二つの異なるコンパイル単位であなたのコードを配置し、実行可能ファイルをビルドする場合は、複数の定義のエラーが発生します。あなたが明示的に「インライン」としての機能をマークすると、あなたはしません。
テンプレート関数については、その後、コンパイルシステムの一部は、同じテンプレートの複数のインスタンスが複数の定義エラーが発生していないことをそれに表示されます。
これは、コンパイラがインラインかどうか、それを作るために決定した場合に応じて、インライン化される可能性があります。