関数の定義がパフォーマンスのために小さく、コンパイルの時間を節約する場合は、関数(クラス内のメソッドではなく通常の関数)をインラインとして宣言することをお勧めします。しかし、クラス内のインラインメソッドについてはどうでしょうか。クラス内のインラインメソッドの概念がわかりません。それらをどのように定義し、どのように機能するか。
しかし、クラス内のインラインメソッドはどうですか?
関数をインライン化するための両方の構文(明示的なinline
を使用し、クラス定義内でメンバー関数を定義する)は、コンパイラーのインライン化に関するヒントのみを提供します。 パフォーマンスの観点から見ると、それらは同等です。
クラス宣言内でメンバー関数を定義する場合、後者の読みやすさが主な関心事である必要があります:実装の詳細の複数の行でクラスインターフェイスを散らかすことは本当に痛いです。したがって、メンバー関数が複数のステートメントである場合は、そうしないでください:return stuff
または単純な転送でも問題ありませんが、通常はそれ以上です。
class MyClass
{
public:
int f() const { return m_i; }
int g() const;
private:
int m_i;
};
inline int MyClass::g() const
{
return m_i;
}
// both member-functions behave equally (except for naming)
クラス内でinline
として関数/プロシージャを指定することは、関数を呼び出してパラメーターを渡すコードを作成する代わりに、関数の内容を呼び出しポイントに配置する必要があることをコンパイラーに示唆しています。
パラメータを渡さずに関数を実行する方が効率的になると、コンパイルされたバイナリのパフォーマンスが向上します。また、すべての呼び出し位置で関数内にあったコードを繰り返すと、コードが高速のキャッシュメモリで見つかる可能性が小さくなるため、パフォーマンスが低下する可能性があります。
クラス関数をインラインにするためにコンパイラに提供する2つのオプションがあります。
(1)クラスの宣言(ヘッダーファイル内)で関数を定義する
class Human {
public:
Human(const char* name);
Human();
// is implicit inline
void lookAt(const char* name) const {
std::cout << "I'm looking at " << name << std::endl;
}
private:
char _name[30];
};
(2)関数の定義で明示的にインラインキーワードを使用する(ヘッダーファイル内)
// is explicit inline
inline void lookAt(const char* name) const {
std::cout << "I'm looking at " << name << std::endl;
}