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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/junbujianwpl/article/details/83867227

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

展开阅读全文

SELECT 'Return Value' = @return_value

07-18

[code=SQL]create procedure [dbo].[PROC_ZM_INSERT]rnasrnbeginrn rn declare insert2_cursor cursor rn for select rn (c.firstName+' '+isnull(c.middleName,'')+' '+c.lastName), a.addressLine1 rn from [HumanResources].[Employeeaddress] as ea rn join [Person].[address] as a on ea.addressid = a.addressid rn join [HumanResources].[Employee] as e on ea.employeeid = e.employeeid rn join [Person].[contact] as c on e.contactid = c.contactidrn rn declare @name varchar(60), @address varchar(60)rn rn open insert2_cursorrn fetch insert2_cursor into @name, @addressrn while @@fetch_status = 0rn beginrn begin tryrn --print @addressrn declare @num varchar(60)rn set @num = substring(@address,1,patindex('% %', @address))rn if isnumeric(@num) = 1rn beginrn if convert(int,@num)> 5000rn beginrn --print @name + '-----' + @address + '-insert into'rn insert into tsql_test ([name],[addr],[lastupdatetime],[lastupdateuser],[delflg]) rn values (@name, substring(@address, patindex('% %', @address), len(@address)), getdate(), 'ZM', 0)rn endrn endrn fetch insert2_cursor into @name, @addressrn end tryrn begin catchrn fetch insert2_cursor into @name, @addressrn end catchrn endrn close insert2_cursor rn rn deallocate insert2_cursor rnendrnrn--执行后rnrnDECLARE @return_value intrnrnEXEC @return_value = [dbo].[PROC_ZM_INSERT]rnrnSELECT 'Return Value' = @return_valuernrnGO[/code]rn'Return Value'的值是-6 为什么,我看其他人的代码'Return Value'都=0 为什么我的事-6? 论坛

没有更多推荐了,返回首页