c/c++:efficient c++,返回值优化,RVO
2015-09-24 21:48
399 查看
连接:/article/7144900.html
返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度。
RVO = return value optimization。
对于执行 A=B+C;
的时候,编译器在原函数创建一个临时变量,作为第三个参数传给 operator +(),使用引用传递,然后再将值赋给 A。
很多的编译器都实现了这样的优化,不过在程序编写的时候需要注意某些细节,才能让编译器执行这一技术。如:
另外,必须定义拷贝构造函数来“打开”RVO
另外还有一种是通过 够着函数实现的,称 计算性构造函数
要点:
1.如果必须按值返回函数,通过RVO可以省去创建和销毁局部对象的步骤。
2.RVO 的应用要遵照编译器的实现而定。
3.通过编写计算性函数可以更好的使用RVO。
返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度。
RVO = return value optimization。
class Complex//复数 { friendd Complex operator + (const Complex & , const Complex&); public: Conplex(double r=0.0,double i= 0.0): real(r),imag(i){} Complex(const Complex& a):real(a.real),imag(a.imag){}; Complex operator = (const Complex &a); ~Complex(); private: double real; double imag; };
对于执行 A=B+C;
的时候,编译器在原函数创建一个临时变量,作为第三个参数传给 operator +(),使用引用传递,然后再将值赋给 A。
很多的编译器都实现了这样的优化,不过在程序编写的时候需要注意某些细节,才能让编译器执行这一技术。如:
//不能使用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 Complex operator +(const Complex & a, const Complex &b) { Complex C(a.real +b.real,a.imag +b.imag); return C; } //能够使用RVO Complex operator +(const Complex & a, const Complex &b) { return C(a.real +b.real,a.imag +b.imag); }
另外,必须定义拷贝构造函数来“打开”RVO
另外还有一种是通过 够着函数实现的,称 计算性构造函数
//计算性构造函数 Complex operator +(const Complex& a, const Complex &b) { return Complex(a,b); } Complex::Complex(const Complex &a ,const Complex &b):real(a.real +b.real),imag(a.imag +b.imag){}
要点:
1.如果必须按值返回函数,通过RVO可以省去创建和销毁局部对象的步骤。
2.RVO 的应用要遵照编译器的实现而定。
3.通过编写计算性函数可以更好的使用RVO。
相关文章推荐
- C++学习笔记四
- C++学习笔记三
- C++学习笔记二
- C++学习笔记
- 漫谈C++11 Thread库之原子操作
- More Effective C++ 条款21 利用重载技术避免隐式类型转换
- VC++6_0调试篇:变量的观察--watch窗口的技巧
- C语言函数sscanf()的用法
- 二级指针的申请跟删除(基于C++的new机制)
- [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数
- More Effective C++ 条款20 协助完成"返回值优化(RVO)"
- (更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++)
- C++中的SFINAE
- C++实现屏幕截图(全屏截图)
- c++连接SQL server2005
- C++ 3维数组指针声明的3种方式
- C++四种类型转换
- 深入理解C++枚举类型enum
- C++在控制台上实现2048游戏
- C++定义自己的命名空间和头文件