3

VC ++では、これは簡単なことではないと思いますが、それでも質問する価値があります。

保護された/プライベートメンバーの値のみを返すクラスのgetterメソッドを作成する場合、コンパイラはこの呼び出しを最適化するので、クラスをフレンドにする必要がなく、完全なメソッド呼び出しのオーバーヘッドなしでそのメンバーを参照するのと同じですか?

4

1 に答える 1

8

はい。どちらのバリアントも同じものにコンパイルされます。

struct test
{
    int x;

    int get() const { return x; }
};

__declspec(noinline) int use_x(const test& t)
{
    return t.x;
}

__declspec(noinline) int use_get(const test& t)
{
    return t.get();
}

int main()
{
    test t = { 111605 };

    // pick one:
    return use_x(t);
    //return use_get(t);
}

コンパイラにとっては、t.get()常に、に置き換えるほど単純ではないことに注意してください。t.x次のようなことを考えてみてください。

t.get() += 5;

+=関数呼び出しの結果は右辺値であり、 (プリミティブの場合)左辺値が必要なため、これはコンパイルしないでください。コンパイラはそのようなことをチェックします。

于 2012-06-29T04:47:27.413 に答える