C++返回值优化-Return Value Optimization
C++中的一些小细节比较多。这里看下返回值优化。
代码
using namespace std;
class RVO{
static int count__;
int id_;
public:
RVO(){id_=count__++;cout<<"constructor"<<id_<<endl;}
RVO(const RVO& r){id_=count__++;cout<<"copy"<<r.id_<<",my id:"<<id_<<endl;}
virtual ~RVO(){cout<<"destruct"<<id_<<endl;}
};
int RVO::count__=0;
RVO testRVO(){
return RVO();
}
//无优化时,testRVO函数等同于下面代码
//RVO * f(RVO * _hiddenAddress) {
// RVO result;
// // copy result into hidden object
// *_hiddenAddress = result;
// return _hiddenAddress;
//}
//有优化时,testRVO函数等同于直接调用构造函数。也有的写成下面的形式,但是比较含糊。
// f(RVO * _hiddenAddress) {
// copy result into hidden object
//}
int main(int argc,char** argv){
RVO r=testRVO(); //没有RVO,此处会有2次拷贝构造函数调用
return 0;
}
如果没有返回值优化,注释处会有2次拷贝构造函数调用。第一次是函数内部拷贝构造返回值临时对象,第二次是用返回值临时对象来拷贝构造外部的r。这样的话开销就比较大了。
测试
加上如下选项可以禁用返回值优化,就可以看到想要的结果了。
g++ -fno-elide-constructors test.cpp
g++ -O0 test.cpp //此处无效,禁用优化,并没有禁用返回值优化选项
./a.out
constructor0
copy0,my id:1
destruct0
destruct1
g++ test.cpp
./a.out
constructor0
destruct0
当加上返回值优化后,直接就变成了构造函数调用。优化过后,效果上是一样的,但是改变了原始的语义。