快速业务通道

C++中按值返回和返回值优化代码

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
mplex();
__tempResult.real=a.real+b.real;
__tempResult.imag=a.imag+b.imag;
return;
}

以上是Efficient C++中的解释,但是我认为__tempResult.Complex::Complex()不应该在函数内部调用,不过并不影响调用次数。

以上便是RVO优化,很多编译器都是支持的,为了防止某些编译器不支持,可以显式地将operator +函数如下实现:

Complex operator +(const Complex& a,const Complex& b)
{
return Complex(a.real+b.real,a.imag+b.imag);
}

以上这种形式称为未命名变量,有些编译器拒绝对已命名变量的RVO优化(比如前面的retVal),这样我们就消除了局部的retVal临时变量。

下面再谈谈__tempResult临时变量的产生,以及消除的方法:

Complex a(1,1),b(2,2),c;

c=a+b;

定义c的时候会调用默认的构造函数进行初始化,因此第一条语句执行完之后,c已经是一个存在的对象,所以第二条语句并没有权利去直接修改c的内容,必须要通过调用赋值操作符(=),因此必须要产生一个临时对象,具体解释语句前面已经介绍过,即__tempResult的产生原因。

但是如果在执行第二条语句的时候c没有旧的内容,即c不是一个已经存在的对象,那么就可以直接调用构造函数,而不需要=操作符,这样也就可以避免了__tempResult 的产生。

所以如下的操作

Complex a(1,1),b(2,2);

Complex c=a+b;

其运行结果为

I''m in constructor
I''m in constructor
I''m in constructor
I''m in destructor
I''m in destructor
I''m in destructor

只调用了三次构造函数和析构函数,和没有优化前相比,性能得到了很大的提升。

来源:http://blog.csdn.net/SeeSeaBee/archive/2007/06/27/1668825.aspx

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号