在以下场景中如何避免不必要的复制?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中。
但在我看来,编译器不太可能聪明到在这里实现复制省略(或者是吗?)。那么你会建议什么来避免这种不必要的复制呢?