注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识60——RVO返回值优化  

2015-04-27 17:34:13|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C++小知识60——RVO返回值优化
记得以前就看过类似的介绍,说编译器会自动的对返回值优化,当时之所以记忆深刻是因为当初学C++时老师反复讲在返回值时,C++会三次创建临时变量,怎么怎么浪费时间,没想到现在的编译器这

么聪明了。但是《提高C++编程性能的编程技术》第四章上,又提到了这个技术,所以就想了起来。
他给了几个版本,举例说明了有的是编译器支持的,有的是不支持的:
class Complex
{
friend Complex operator+(const Complex&a,const Complex&b);
public:
Complex(double r = 0.0,double i = 0.0):real(r),imag(i){}
Complex(const Complex&c):real(c.real),imag(c.imag){}
Complex&operator =(const Complex&c);
.......
private:
double real;
double imag;
};
 Complex operator+(const Complex&a,const Complex&b)
{
Complex retVal;
retVal.real = a.real + b.real;
retVal.imag = a.imag + b.imag;
return retVal;
}
某编译器不支持RVO:
Complex operator+(const Complex&a,const Complex &b)
{
Complex retVal;
retVal.real = a.real + b.real;
retVal.imag = a.imag +b.imag;
return retVal;
}
但是对如下代码进行RVO:
Complex operator+(const Complex&a,const Complex&b)
{
double r = a.real + b.real;
double i = a.imag + b.imag;
return Complex(r,i);
}
书上的意思说,编译器一般是避免对有名的临时变量进行优化。另外还有一个需要注意的,必须定义拷贝构造函数,如果相关的类没有定义拷贝构造函数,那么RVO就会悄悄关闭。
另外它还说道,当编译器无法RVO时,可按计算性构造函数的形式来实现消除局部变量的方法。这里就不再详述,有兴趣大家可以查看一下相关资料。
  评论这张
 
阅读(246)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017