《MORE EFFECTIVE C++》条款20 条款21
2015-11-16 18:36
399 查看
条款20 协助编译器实现返回值优化
当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数,这笔开销还是很大的。现在的新编译器已经可以对这种情况进行优化了,甚至优化到连开销都没有,只是有一定的适用范围。如果可以返回一个匿名的临时对象,并且利用构造函数来得到结果对象,那么就有可能被优化到零开销。注意,有名字的对象意味着返回值优化不可用。
假设有如下的代码:
node a(2); node b(3); node c=a+b;
函数的原型大概是这样的:
const node add(const node& a,const node& b) { return node(a,b); }
这里返回了一个匿名的临时对象,但是编译器可能会进行优化,甚至零开销(但是c的构造函数开销还是要的)。即使没有优化,我们尽量这么用也没有什么坏处。
条款22 考虑使用op=来取代单独的op运算符
一般情况下,operator + 只需要定义operator +=就可以一块实现了, 主要的目的是还可以使用条款20中的优化作用,即利用构造函数来达到返回值优化的作用。例如:
struct node { public: const node& operator += (const node& rhs) const { ... return this; } }; const node operator +(const node& a,const node& b) { return node(a)+=b; }
对于返回值优化,如果加上inline内联的话,可能更好。
这两篇其实看得不是很明白,只是知道如果这样子用估计会更高效,但是肯定不会花费更多的开销。书中也没有肯定地讲这样一定就优化得了。
相关文章推荐
- 《C++编程风格》摘要
- 【LeetCode-283】Move Zeroes(C++)
- Sublime Text2配置C++编译环境
- qml与c++混合编程之简单demo说明
- oc语言学习之基础知识点介绍(一):OC介绍
- C++ Assert()
- c++ 内存管理
- JAVA调用c/c++代码
- 15.c/c++程序员面试宝典-内存分配
- c++析构函数没有执行
- C# 调用C/C++回调函数
- 探究C语言中的前++和后++
- 探究C语言中的前++和后++
- c语言中,宏和函数的区别
- VCG Libary学习笔记(1) 概述 安装 文件夹结构
- 第十周项目2 二叉树遍历的递归算法
- C++ 06装饰模式
- 菜鸟浅析JAVA,.NET,C/C++的区别
- C++11::遍历tuple中的元素
- const修饰符(C++11标准)