web-dev-qa-db-ja.com

クラス内のインライン関数メンバー

関数の定義がパフォーマンスのために小さく、コンパイルの時間を節約する場合は、関数(クラス内のメソッドではなく通常の関数)をインラインとして宣言することをお勧めします。しかし、クラス内のインラインメソッドについてはどうでしょうか。クラス内のインラインメソッドの概念がわかりません。それらをどのように定義し、どのように機能するか。

48
AlexDan

しかし、クラス内のインラインメソッドはどうですか?

関数をインライン化するための両方の構文(明示的な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)
56

クラス内でinlineとして関数/プロシージャを指定することは、関数を呼び出してパラメーターを渡すコードを作成する代わりに、関数の内容を呼び出しポイントに配置する必要があることをコンパイラーに示唆しています。

パラメータを渡さずに関数を実行する方が効率的になると、コンパイルされたバイナリのパフォーマンスが向上します。また、すべての呼び出し位置で関数内にあったコードを繰り返すと、コードが高速のキャッシュメモリで見つかる可能性が小さくなるため、パフォーマンスが低下する可能性があります。

21
John

クラス関数をインラインにするためにコンパイラに提供する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;

    }
18
Jan Koester