Rvalue reference 右值引用 Move Semantics
为了解决非必要的拷贝:当赋值的右边是一个右值的时候,左边可以去‘偷’右边的内容,而不需要去allocation(分配空间)
- 左值:变量可以出现在赋值符号的左手边
- 右值:不能放在左边的叫右值,例如临时对象,以下右边两个是标准库的写法,却推翻了自己的想法,不管他,临时对象就是右值1:
以前的右值出现在右边是不可以取地址的,但是c++现在希望可以这么做
两种insert 上面的是原始的版本,下面的是‘偷’的版本,原来的string的拷贝函数也需要重载一个,原版copy是深拷贝,重新分配内存,新版是直接指针指像原来的地址(到此为止就是浅拷贝),并且将之前的指针打断。因此,只要保证赋值的那个对象是个右值或者以后不会再用,都可以用‘偷’的方式赋值给别的变量。
Unperfect Forwarding 不完美转接
在forwad里面调用process,第四,五行,forward传入一个右值,但是调用的确是process的左值版本,
perfect Forwarding 完美转接
标准库的写法
写一个move aware class
拷贝构造以及拷贝赋值都需要写一个move版本(参数为 &&str)
测试
对vector的影响最大,对其他容器的影响较小,容器如果是以节点存在的,影响就小
对list的影响
普通版本的copy
move版本的copy,整个容器当成右值
新增的容器
红框的是新的
array
hashtable
篮子是由vector实现的,当元素的个数等于篮子个数时,篮子进行扩充到了原来的两倍左右的素数,然后重新计算元素落的篮子
通常使用时,放的是我们自己设计的类对象,通过hashfunction计算出hashcode,来存放在hashtable中
hash是一个type hash()是一个临时对象 创建一个的临时对象,调用计算得出hashcode
c++ 2.0 以前hash那个是无法通过的
tuple
右下角对类型做操作,元编程