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对象里面都有转移构造函数和转移赋值函数。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[原创]传递UIScrollView的滑动事件到其子视图中

在开发项目时&#xff0c;遇到了一个问题&#xff1a; 我的UIScrollViewOut中嵌入了一个UIScrollViewIn, 当我想要拖动UIScrollViewIn时,UIScrollViewOut却动了&#xff0c;而UIScrollViewIn没有动。但是只要按住UIScrollViewIn一会再拖动&#xff0c;UIScrollViewIn就可以滑动…

linux内核设计与实现 怎么读,《Linux内核设计与实现》读书笔记(一)

第一次写读书笔记&#xff0c;有什么套路呢&#xff1f;还没来得及去学习。《linux kernel的设计与实现》真的是一本好书&#xff0c;里面的东西解答了很多工作中的疑问。如显示地调用schedule()进行调度&#xff0c;系统调用__syscalln()&#xff0c;一些数据结构函数经常在ke…

C++中正确使用PRId64

nt64_t用来表示64位整数&#xff0c;在32位系统中是long long int&#xff0c;在64位系统中是long int&#xff0c;所以打印int64_t的格式化方法是&#xff1a; [cpp] view plaincopy printf("%ld", value); // 64bit OS printf("%lld", value); // 32bi…

大话细说ORM -----(转)

什么是ORM&#xff1f; ORM&#xff0c;即对象关系映射(Object Relational Mapping)表示一种技术&#xff0c;用来把&#xff08;对象模型&#xff09;表示的对象映射到基于SQL的&#xff08;关系模型&#xff09;数据结构中去。 说得通俗点&#xff0c;就是在对象的属性与关系…

linux中权限的名词解释,Linux的基本权限和特殊权限

基本权限的类别访问方式(权限)&#xff1a;-读写&#xff1a;允许查看内容-read r-写入&#xff1a;允许修改内容-write w-可执行&#xff1a;允许运行和切换-execute x对于文本文件&#xff1a;r&#xff1a;cat head tail lessw&#xff1a;vimx&#xff1a…

乱写

想写点东西&#xff0c;又不知道从何下笔。可是心情又觉得有些许不爽&#xff0c;那就漫无思绪想到哪写哪吧。 昨天加了一个HR的QQ&#xff0c;发了一封简历过去&#xff0c;她说她打开我的简历电脑就蓝屏了&#xff08;无语&#xff09;&#xff0c;这管不着我简历的事吧。然后…

容器set和multiset

一、set和multiset基础 set和multiset会根据特定的排序准则&#xff0c;自动将元素进行排序。不同的是后者允许元素重复而前者不允许。 需要包含头文件&#xff1a; #include <set> set和multiset都是定义在std空间里的类模板&#xff1a; [cpp] view plaincopyprint? t…

linux centos命令语法,linux-centos7

# :-: linux常用的相关查询命令### **1.查看linux用户命令**cat /etc/passwd### **2.查看cpu,mem**grep "model name" /proc/cpuinfo 查看cpu核数cat /proc/cpuinfo 查看cpu详细信息grep MemTotal /proc/meminfo 查看内存总大小以及剩余大小…

oracle rac理解和用途扩展

Oracle RAC的优势在于利用多个节点&#xff08;数据库实例&#xff09;组成一个数据库&#xff0c;这样在保证了数据库高可用性的情况下更充分的利用了多个主机的性能&#xff0c;而且可以通过增加节点进行性能的扩展。实现Oracle RAC需要解决的关键问题就是多节点进行数据访问…

std::set作为一个有序集合

摘要&#xff1a;std::set作为标准库的一个关联容器&#xff0c;实现内部元素进行了排序&#xff0c;使用这特性可以对一组元素进行插入排序。std::set最初的设计是完成数学中“集合”的概念&#xff0c;它提供的接口也是如此。本文简单地介绍一下这一个标准库容器。 为了使用s…

linux查看某进程的连接,linux下查看指定进程的所有连接信息(转)

定位某个进程的网络故障时经常需要用到的一个功能就是查找所有连接的信息。通常查找某个端口的连接信息使用 ss 或者 netstat 可以轻松拿到&#xff0c;如果是主动与别的机器建立的连接信息则可以通过 lsof 命令来获得。例如我想要查看进程 frps 当前的所有连接信息&#xff0c…

SQLite多线程使用总结

SQLite支持3种线程模式&#xff1a;单线程&#xff1a;这种模式下&#xff0c;没有进行互斥&#xff0c;多线程使用不安全。禁用所有的mutex锁&#xff0c;并发使用时会出错。当SQLite编译时加了SQLITE_THREADSAFE0参数&#xff0c;或者在初始化SQLite前调用sqlite3_config(SQL…

linux rom打包工具,Android rom解包打包工具

eMMC主要是针对手机和平板电脑等产品的内嵌式存储器&#xff0c;由于其在封装中集成了一个控制器&#xff0c;且提供标准接口并管理闪存等优势&#xff0c;越来越受到Android手机厂商的青睐&#xff0c;以eMMC为存储设备的android手机&#xff0c;其文件系统(system、data分区)…

winform(C#)透明方法

1.设置窗体opacity属性&#xff1a; 2.窗体的BackColor和TransparencyKey属性设置相同的值&#xff1a; 2.加using System.Runtime.InteropServices;引用然后加上以下代码&#xff1a; [StructLayout(LayoutKind.Sequential)]public struct MARGINS{public int Left;public int…

ssh免密码登陆

1. 先去掉root登陆密码 passwd -d root 或者修改/etc/shadow 文件&#xff0c;将root那行&#xff0c;前两个冒号之间的加密过的密码去掉 2. 修改sshd_config文件 PermitEmptyPasswords yes

linux彻底卸载xfce,Ubuntu12.04LTS下如何安装和彻底卸载xfce4?

今天将Ubuntu12.04更新完了&#xff0c;用的网易的源&#xff0c;更新速度还是很给力的&#xff0c;平均500多K的下载速度。发现虚拟机上unity界面还是比较卡的&#xff0c;想换成gnome3.6试一下&#xff0c;结果rangerlee说xfce和lxde桌面很清爽&#xff0c;并且轻量占用内存少…

分布式缓存应用(转载的)

前言 Asp.Net中使用Couchbase——Memcached缓存入门篇 见http://www.cnblogs.com/aehyok/p/3436721.html 主要讲解Couchbase服务端的安装配置和客户端的引用调用&#xff0c;然后通过一个零配置的代码来完成最简单的代码实现调用。那么本次课先通过简单的配置文件进行配置&…

详细解析Linux /etc/passwd文件

在Linux /etc/passwd文件中每个用户都有一个对应的记录行&#xff0c;它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。这个文件对所有用户都是可读的。但是Linux /etc/passwd文件中都有些什么内容呢&#xff1f; 它的内容类似下…

linux eclipse 头文件路径,Eclipse CDT标准库头文件设置

使用eclipse cdt开发C/C项目的时候&#xff0c;从eclipse官网下的linux下的专门版本在Fedora上能自动Discovery机器上的gcc/g头文件、符号之类的&#xff0c;但是在我用的slackware下却不行&#xff0c;需要手动添加标准库头文件路径/usr/include、/usr/local/include……&…

Jquery通过遍历数组给checkbox赋默认值

需求&#xff1a;有一个数组&#xff1a;(北京菜&#xff0c;粤菜)&#xff0c;checkbox如下&#xff1a; 现在想通过遍历这个数组&#xff0c;使数组里包含的值&#xff0c;在checkbox选中 代码&#xff1a; var flavors new Array([北京菜 , 粤菜]); $.each(flavors,functio…