<<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 标准新特性: 右值引用与转移语义(点评)相关推荐

  1. std::move C++11 标准新特性: 右值引用与转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...

  2. C++11 标准新特性: 右值引用与转移语义

    原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新 ...

  3. 【转】C++11 标准新特性: 右值引用与转移语义

    VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...

  4. C++11新特性 右值引用与移动语义

    右值引用作用是可以减少内存拷贝次数,从而优化性能. 首先,什么是右值?右值是一个与左值相区分的概念.左值是:既能出现在等号左边也能出现在等号右边的变量或表达式,比如int a = 5,那么a就是一个左 ...

  5. C++右值引用与转移语义

    std::forwad? C++11 中定义的 T&& 的推导规则为: 右值实参为右值引用,左值实参仍然为左值引用. 参考: 右值引用与转移语义 转载于:https://www.cnb ...

  6. C++ C++11新特性--右值引用

    左值与右值 在C语言中,左值和右值一般有两种区分的方法.可以出现在赋值符号"="的两边的值为左值,只能出现在赋值符号"="的右边的值为右值:还有一种说法是能取地 ...

  7. C++11 右值引用、移动语义、完美转发、万能引用

    C++11 右值引用.移动语义.完美转发.引用折叠.万能引用 转自:http://c.biancheng.net/ C++中的左值和右值 右值引用可以从字面意思上理解,指的是以引用传递(而非值传递)的 ...

  8. [C++11] 右值引用和移动语义

    c++11引入了右值引用和移动语义,通过避免无谓的复制,以提高程序的执行效率. 1.左值与右值 c++中的数值必属于左值或右值之一,通常有以下方法进行区分: 左值:在赋值语句左侧,右值:在赋值语句右侧 ...

  9. 右值引用与move语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...

最新文章

  1. YOLOv3和YOLOv4长篇核心综述(下)
  2. Linux下的ATT语法(即GNU as 汇编语法)入门
  3. codeforce 154C - Double Profiles(hash)
  4. jQuery中 trigger() bind() 使用心得
  5. log4net使用详解
  6. python 多元线性回归_Python机器学习,多元线性回归分析问题
  7. ConcurrentLInkedQueue队列
  8. The directory '*' or its parent directory is not owned by the current user
  9. UI实用素材模板|天气应用app的ui设计
  10. 玩转PHP关联数组的10个技巧(3)
  11. thinkpad键盘功能键驱动_韩度X-104机械键盘拆解评测 - 性价之选
  12. C#多线程学习笔记(三)
  13. 物联网-智能家居相关知识了解
  14. PAL电视制式知识点
  15. 基于html + css + js完成淘宝网首页效果
  16. 苹果软件上app注意事项
  17. RCLAMP0544T 国产替代上海雷卯ULC0544T
  18. 又到年末“团建”!某企业员工吐槽:这真是一场噩梦……
  19. 科技现代闪耀上海秀场 北京现代在上海车展上演转型之姿
  20. 三维电影特效动画制作软件——Houdini 17.5

热门文章

  1. 向oracle表空间添加一个数据文件命令
  2. 会移动的文字(Marquee)
  3. java流的应用_Java中I/O流的应用
  4. eclipse 安装git
  5. 10 | 递归:如何用三行代码找到“最终推荐人”?
  6. linux vi命令 置顶,[置顶] Linux vi命令 创建文件
  7. .Net 中的封装知识点
  8. android绘制环形进度_Android动态自定义圆形进度条
  9. 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题
  10. 【Python笔记】异常处理