C++返回值优化-Return Value Optimization

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

当加上返回值优化后,直接就变成了构造函数调用。优化过后,效果上是一样的,但是改变了原始的语义。

参考链接
https://en.wikipedia.org/wiki/Copy_elision

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值