效率:条款19 了解临时对象的来源
来源:互联网 发布:linux i2c 驱动 实例 编辑:程序博客网 时间:2024/06/12 01:38
人们对临时对象有普遍的误解:如swap函数:
<span style="font-size:14px;">template<class T>void swap(T& object1 , T& object2){ T temp = object1; object1 = object2; object2 = temp;}</span>
认为temp是一个临时对象,其实不然,temp不是临时对象,而是一个函数的局部对象。
C++真正的临时对象是不可见的-不会出现在源码中,临时对象主要发生在这两种情况:1.当隐式类型转换发生用来调用函数时。2.当函数返回对象的时候。因为临时对象的产生伴随着该对象的构造成本和析构成本,从而影响程序的效率。
1.为了让函数调用成功而产生的临时对象。(此类行为发生在传递某对象给一个函数,而其类型与它即将绑定上去的参数类型不同)列如:
<span style="font-size:14px;">size_t countchar(const string& str,char ch)char buffer[Max_STRING_LEN];char c;cout<<countchar(buffer,c)<<endl;</span>
<span style="font-size:14px;">由于函数的参数是string类型,而实参是个char数组。两者类型不吻合,想要调用成功,编译器会自动产生一个类型为string的临时对象。string temp(buffer);于是countchar函数会将形参绑定到该临时对象上,当countchar返回,此临时对象会被自动销毁。</span>2.产生临时对象的情况是当函数返回一个对象时。列如:
const Number operator++(const Number& lhs,const Number rhs);
此函数返回值就是个临时对象,因为它没有名称,它就是函数的返回值,每当你调用operator++,该临时对象会进行构造和析构。想要不承担这份成本,那么在更改该代码是不能克服这个缺陷。所以我们将更改这个函数返回值类型的,是编辑器能够将临时对象优化,使它不存在。就是“返回值优化”策略。
结论:临时对象可能很耗成本,所以你应该尽可能消除他们。然而更重要的是,如何训练出锐利的眼睛,看出可能产生临时对象的地方。任何时候只要你看到一个reference-to-const参数,就极可能会有一个临时对象被产生出来绑定至该参数上。任何时候只要你看到函数返回一个对象,就会产生临时对象(并于稍后销毁)。
0 0
- 效率:条款19 了解临时对象的来源
- 条款19 了解临时对象的来源
- 条款十九:了解临时对象的来源
- 条款19了解临时对象的来源 练习
- 19. 了解临时对象的来源
- [More Effective C++]条款十九:理解临时对象的来源
- [More Effective C++]条款十九:理解临时对象的来源
- 临时对象的来源
- 临时对象的来源
- 临时对象的来源
- 了解临时对象的来源 (深刻理解为什么不能返回一个临时变量的引用)
- 理解临时对象的来源
- 理解临时对象的来源
- 理解临时对象的来源(More Effective C++_19(效率))
- More Effective C++----(19)理解临时对象的来源
- 9.深刻理解临时对象的来源
- c++临时对象的来源即成本
- More Effective C++ ——019_理解临时对象的来源
- 操作系统找不到已输入的环境选项解决方案
- 七牛---Python_SDK_Demos
- spark源码学习(四):Resultstage的产生和submitstage提交
- hive CLI启动时报错:
- c++11中的日期和时间库
- 效率:条款19 了解临时对象的来源
- enter || f5 || ctrl+f5
- wex5的组件简介
- CocoaPods检测需要更新的命令
- IielgnairTs'lacsaP.119
- VS与Matlab混合编译 - mexw64
- STM32 IAP在线升级教学
- 手札:如何将自动化测试的截图自动的整理生成一个html展示出来
- 透视变换-鸟瞰图