本文为第六部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.html

Move语义和编译器优化

考虑下面这样的函数定义:

X foo()
{
X x;
// perhaps do something to x
return x;
}

现在同以前一样进行假设,给出一个X类,我们可以通过重载它的拷贝构造函数和拷贝赋值操作符来实现move语义。如果你看了一眼上面的函数定义的话,你可能会禁不住说:「等一下,这里有一份从x到foo函数返回值位置的值拷贝。让我来确定我们使用了move语义」:

X foo()
{
X x;
// perhaps do something to x
return std::move(x); // making it worse!
}

不幸的是,这不仅不会让事情变好,可能会变得更糟。任何现代的编译器均可对原始的函数定义实现返回值优化return value optimization)。另一种说法,并不是在本地构造x然后将它拷贝出,而是编译器会在foo的返回值的位置直接构造x对象。很明显,这会比使用move语义更好。

所以你看,为了确切地有效地利用好右值引用和move语义,你需要充分理解并且对现在的编译器的各种「优化」有充分的考量,类似于返回值优化和复制省略(copy elision)。Dave Abrahams在这方面写了一系列文章,可以参见这里:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/这些细节可能都很微妙,但是,我们选择C++作为我们的编程语言是有原因的,对吧?我们选择了它,那么我们就应该认真对待它。

最新文章

  1. mysql表单输入数据出现中文乱码解决方法
  2. HA-0302 退役
  3. [jQuery]《锋利的jQuery》插件部分总结
  4. cocos2d-x使用DragonBones动画
  5. VCS仿真生成fsdb文件(Verilog)
  6. poj 3273 Monthly Expense (二分)
  7. 微信小程序的登陆流程详解
  8. python调用c代码2
  9. Woody的Python学习笔记1
  10. openstack项目【day23】:KVM介绍
  11. word里如何将模板的样式(标题啊、字体啊)导入到另外的模板里
  12. UVA10817-Headmaster's Headache(动态规划基础)
  13. Django中的信号基础知识
  14. Win server 2012 +IIS8.0下安装SSL证书
  15. Mac+Docker环境下xdebug的配置
  16. dataGridView使用指南系列一、回车换行或换列完美解决方案
  17. python --- 字符编码学习小结
  18. js setTimeout 传递带参数的函数的2种方式
  19. 黄聪:自定义WordPress顶部管理工具条的技巧(转)
  20. MMORPG 游戏服务器端设计

热门文章

  1. [SHELL]判断一个命令是否存在
  2. 阿里云主机(aliyun-Linux) x64安装Redis详解
  3. Node.js热部署方式
  4. [转载] Linux poll机制
  5. python3实现的web端json通信协议
  6. (转)document.cookie.indexof的解释
  7. [置顶] Oracle 11g ASM:如何在 ASMCMD 命令行工具中创建 Oracle ACFS 文件系统
  8. GOPS2017全球运维大会深圳站 出席嘉宾盘点!
  9. 案例:数据库open时报错ORA-1172,ORA-1151 处理
  10. JS判斷文件大小
  11. 【hihoCoder】#1039 : 字符消除 by C solution
  12. webservice wsdl语法基础
  13. 初窥图像识别与k-means算法
  14. c# 虚函数 ,抽象类
  15. SQL Server的JOIN是支持使用小括号修改执行顺序的
  16. 【python深入】map/reduce/lambda 内置函数的使用
  17. git 入门教程之本地和远程仓库的本质
  18. js对数组中的数字排序
  19. IGMP协议
  20. jQuery事件--mouseover()、mouseout()、mouseenter()和mouseleave()