返回值优化(More Effective C++_20(效率))
2015-09-05 16:26
531 查看
我们知道一个返回对象的函数很难有很高的效率,因为传值会调用对象内的构造函数和析构函数;而一些函数必须要返回对象,这是难以避免的,所以,我们关心的重点,并不是去消除返回对象,而是怎么减少返回对象所用的开销上来;
幸好,编译器支持返回值优化,能让编译器消除临时对象的开销;下面我们考虑简单实现一个有理数的代码:
上述代码的结果是:
再看下经过以下返回值优化的代码:
其结果是:
从以上结果对比中,很清楚的看到做返回值优化用的时间少很多,仅仅只需要为obj3 = obj1 * obj2,花费一个构造函数,因为obj3是一个新变量,这是无法避免的,而其他开销几乎没有;
牢记:返回值优化(RVO)
这里内联函数可有可无,注意:这种优化对普通的赋值运算符无效;最终结论是,在保持语意正确的前提下,没有更好的优化了
参考:More Effective C++ (侯捷译)
幸好,编译器支持返回值优化,能让编译器消除临时对象的开销;下面我们考虑简单实现一个有理数的代码:
#include <iostream> #include<opencv2\core\core.hpp> using namespace std; using namespace cv; class Rational { public: Rational(int x,int y):a(x),b(y){ cout<<"构造函数"<<endl; }; ~Rational(){ cout<<"析构函数"<<endl; }; Rational(const Rational& rhs){ this->a=rhs.a; this->b=rhs.b; cout<<"复制构造函数"<<endl; } int ReturnA()const{return a;} int ReturnB()const{return b;} inline const Rational operator*(const Rational& rhs){ Rational temp(this->ReturnA()*rhs.ReturnA(),this->ReturnB()*rhs.ReturnB()); return temp; } friend ostream& operator<<( ostream& os,const Rational& s){ os<<s.a<<"/"<<s.b; return os; } private: int a; int b; }; int main() { Rational obj1(2, 3), obj2(4,6); double dur; dur=static_cast<double>(getTickCount()); Rational obj3 = obj1 * obj2; dur=static_cast<double>(getTickCount())-dur; dur=dur/getTickFrequency(); cout<<"obj3= "<<obj3<<endl; cout<<"花费的时间:"<<dur<<endl; cout<<endl; return 0; }
上述代码的结果是:
构造函数 构造函数 构造函数 复制构造函数 析构函数 obj3= 8/18 花费的时间:0.00292201 析构函数 析构函数 析构函数 请按任意键继续. . .
再看下经过以下返回值优化的代码:
inline const Rational operator*(const Rational& rhs){ return Rational(this->ReturnA()*rhs.ReturnA(),this->ReturnB()*rhs.ReturnB()); }
其结果是:
构造函数 构造函数 构造函数 obj3= 8/18 花费的时间:0.000826902 析构函数 析构函数 析构函数 请按任意键继续. . .
从以上结果对比中,很清楚的看到做返回值优化用的时间少很多,仅仅只需要为obj3 = obj1 * obj2,花费一个构造函数,因为obj3是一个新变量,这是无法避免的,而其他开销几乎没有;
牢记:返回值优化(RVO)
**inline const Rational operator*(const Rational& rhs){ return Rational(this->ReturnA()*rhs.ReturnA(),this->ReturnB()*rhs.ReturnB());** }
这里内联函数可有可无,注意:这种优化对普通的赋值运算符无效;最终结论是,在保持语意正确的前提下,没有更好的优化了
参考:More Effective C++ (侯捷译)
相关文章推荐
- __cdecl 、__fastcall、__stdcall
- c++文件操作
- C++内存详解
- Effective C++——条款22(第4章)
- 简单的C++游戏载入界面设计
- c++のeof
- effective c++ 尽量以const enum inline 替换 #define
- C语言怎么将用户账号密码写入文件实现登录注册功能?
- C语言怎么将用户账号密码写入文件实现登录注册功能?
- C++中的虚基类
- iOS求职之C语言面试题
- C++蜗牛
- 【C++】类的特殊成员变量+初始化列表
- c++运算符重载
- 漫谈C指针第七讲---const int *pi 的语义
- 理解临时对象的来源(More Effective C++_19(效率))
- C++之成员函数的重载,覆盖,隐藏
- POJ C++程序设计 编程题#1 编程作业—STL1
- C++设计模式-Command命令模式
- 【C++】默认构造函数