C++11 标准新特性: 右值引用与转移语义(点评)
<<C++11 标准新特性: 右值引用与转移语义>>
原文地址如下
http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/
对MyString那个例子来说。
我写了三个测试用例。
1. MyString a;
a = MyString("Hello"); //调用转移构造函数
std::vector<MyString> vec;
vec.push_back(MyString("World")); //调用转移赋值函数
这种情况下,本身MyString("World")这个对象就是一个临时对象,因此本身他就是右值。因此只要我们给这个类定义了,转移构造函数和转移赋值函数,那么在有右值出现的时候。就会调用我们的转移构造函数和转移赋值函数了。
2. MyString b;
b = a; //调用拷贝构造函数
vec.push_back(b); //调用拷贝赋值函数
因为a,b都为左值,因此会调用拷贝构造函数和拷贝赋值函数。对MyString这个类来说,就会重新分配资源并进行深
拷贝。
3. MyString c;
c = std::move(a); //调用转移构造函数
vec.push_back(std::move(b)); //调用转移赋值函数
因为所有的命名对象都只能是左值引用,如果已知一个命名对象不再被使用,而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,就需要std::move,这个函数以非常简单的方式将左值引用转换成右值引用。
另外,大家如果把这三段程序,放到一个main里面测试的话,在定义vec后,需要写上这句
vec.reserve(4)
因为第一次push_back的时候,vector的capacity是1,第二次push_back的时候,vector的capacity为2,这时,vector应该是要重新分配一块区域,把第一次push_back的对象也拷贝过去,因此会多打印出一些printf信息,会干扰我们的分析过程。因此,只有一上来把他的capacity分的大一点,就不会再重新分配内存并拷贝对象了。
muduo里面对boost::function的传递,基本都是用的std::move,估计function对象里面都有转移构造函数和转移赋值函数。
C++11 标准新特性: 右值引用与转移语义(点评)相关推荐
- std::move C++11 标准新特性: 右值引用与转移语义
新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...
- C++11 标准新特性: 右值引用与转移语义
原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新 ...
- 【转】C++11 标准新特性: 右值引用与转移语义
VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...
- C++11新特性 右值引用与移动语义
右值引用作用是可以减少内存拷贝次数,从而优化性能. 首先,什么是右值?右值是一个与左值相区分的概念.左值是:既能出现在等号左边也能出现在等号右边的变量或表达式,比如int a = 5,那么a就是一个左 ...
- C++右值引用与转移语义
std::forwad? C++11 中定义的 T&& 的推导规则为: 右值实参为右值引用,左值实参仍然为左值引用. 参考: 右值引用与转移语义 转载于:https://www.cnb ...
- C++ C++11新特性--右值引用
左值与右值 在C语言中,左值和右值一般有两种区分的方法.可以出现在赋值符号"="的两边的值为左值,只能出现在赋值符号"="的右边的值为右值:还有一种说法是能取地 ...
- C++11 右值引用、移动语义、完美转发、万能引用
C++11 右值引用.移动语义.完美转发.引用折叠.万能引用 转自:http://c.biancheng.net/ C++中的左值和右值 右值引用可以从字面意思上理解,指的是以引用传递(而非值传递)的 ...
- [C++11] 右值引用和移动语义
c++11引入了右值引用和移动语义,通过避免无谓的复制,以提高程序的执行效率. 1.左值与右值 c++中的数值必属于左值或右值之一,通常有以下方法进行区分: 左值:在赋值语句左侧,右值:在赋值语句右侧 ...
- 右值引用与move语义
新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...
最新文章
- YOLOv3和YOLOv4长篇核心综述(下)
- Linux下的ATT语法(即GNU as 汇编语法)入门
- codeforce 154C - Double Profiles(hash)
- jQuery中 trigger() bind() 使用心得
- log4net使用详解
- python 多元线性回归_Python机器学习,多元线性回归分析问题
- ConcurrentLInkedQueue队列
- The directory '*' or its parent directory is not owned by the current user
- UI实用素材模板|天气应用app的ui设计
- 玩转PHP关联数组的10个技巧(3)
- thinkpad键盘功能键驱动_韩度X-104机械键盘拆解评测 - 性价之选
- C#多线程学习笔记(三)
- 物联网-智能家居相关知识了解
- PAL电视制式知识点
- 基于html + css + js完成淘宝网首页效果
- 苹果软件上app注意事项
- RCLAMP0544T 国产替代上海雷卯ULC0544T
- 又到年末“团建”!某企业员工吐槽:这真是一场噩梦……
- 科技现代闪耀上海秀场 北京现代在上海车展上演转型之姿
- 三维电影特效动画制作软件——Houdini 17.5
热门文章
- 向oracle表空间添加一个数据文件命令
- 会移动的文字(Marquee)
- java流的应用_Java中I/O流的应用
- eclipse 安装git
- 10 | 递归:如何用三行代码找到“最终推荐人”?
- linux vi命令 置顶,[置顶] Linux vi命令 创建文件
- .Net 中的封装知识点
- android绘制环形进度_Android动态自定义圆形进度条
- 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题
- 【Python笔记】异常处理