次のシナリオで不要なコピーを回避するにはどうすればよいですか? クラス A には、大きなオブジェクトへの基本型ポインターが含まれています。
class A{
BigBaseClass *ptr;
A(const BigBaseClass& ob);
~A(){delete ptr;}
};
オブジェクトobをコピーする必要がある場合があります。そこで、仮想クローニングを実装します。
class BigBaseClass{
virtual BigBaseClass* clone() {return new BigBaseClass(*this);}
};
class BigDerivedClass : BigBaseClass{
virtual BigDerivedClass* clone() {return new BigDerivedClass(*this);}
};
A::A(const BigBaseClass& ob):ptr(ob.clone(){}
しかし、一時的な BigDerivedClass オブジェクトを作成し、それを使用してクラス A を構築することがあります。
A a{BigDerivedClass()};
また
BigDerivedClass f(){
BigDerivedClass b;
/*constructing object*/
return b;
}
A a{f()};
ここでは、作成したオブジェクトをコピーしてから削除する必要はありません。このオブジェクトをヒープに直接作成し、そのアドレスをa.ptrに保存することができます。
しかし、コンパイラがここでコピー省略を実装するのに十分スマートであるとは思えません (またはそうですか?)。では、そのような不必要なコピーを避けるために何を提案しますか?