コンパイル段階でクラス メンバー関数をインライン化する場合は、関数をクラス宣言ブロック内で定義する必要があるようです。
それは本当ではありません。クラス定義内で定義された関数は、暗黙的に としてマークされinline
ます。ただし、クラス内で関数を定義する必要はありませんinline
。明示的に要求できます。
struct X {
void f();
};
inline void f() {}
一方inline
、キーワードは、関数がインライン化されることを意味するのではなく、複数の翻訳単位で定義できることを意味します。つまり、複数の翻訳単位にその定義を含む同じヘッダーが含まれている場合、リンカーは失敗しません。重複定義エラーあり。
さて、実際のinliningでは、コンパイラは、その関数の定義(インライン化されるコード) を参照することをinline
条件として、関数が宣言されているかどうかに関係なく、関数をインライン化するかどうかを決定できます。インライン化されることを意図した関数は、ヘッダーで定義する必要があります (クラス定義の内側または外側にマークされています。inline
さらに、新しいツールチェーンは、プログラム全体の最適化またはその他のリンク時の最適化を実行できます。これにより、リンカーは関数をインライン化する必要があることも決定できます。この場合、関数定義は呼び出しサイトで表示される必要がないため、.cpp ファイル内で定義できます。ただし、本当に関数をインライン化したい場合は、この機能に依存せず、ヘッダーで関数を定義するだけの方がよいでしょう。