VC ++では、これは簡単なことではないと思いますが、それでも質問する価値があります。
保護された/プライベートメンバーの値のみを返すクラスのgetterメソッドを作成する場合、コンパイラはこの呼び出しを最適化するので、クラスをフレンドにする必要がなく、完全なメソッド呼び出しのオーバーヘッドなしでそのメンバーを参照するのと同じですか?
VC ++では、これは簡単なことではないと思いますが、それでも質問する価値があります。
保護された/プライベートメンバーの値のみを返すクラスのgetterメソッドを作成する場合、コンパイラはこの呼び出しを最適化するので、クラスをフレンドにする必要がなく、完全なメソッド呼び出しのオーバーヘッドなしでそのメンバーを参照するのと同じですか?
はい。どちらのバリアントも同じものにコンパイルされます。
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;
+=
関数呼び出しの結果は右辺値であり、 (プリミティブの場合)左辺値が必要なため、これはコンパイルしないでください。コンパイラはそのようなことをチェックします。