1.对象移动
1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力
2)优势:
- 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能
- 有些类如IO类或unique_ptr类包含不能被共享的资源,它们不能被拷贝但是可以移动
3)移动操作“窃取”资源,并不分配任何内存
2.右值引用
1)C++11引入右值引有来支持移动操作,绑定到右值的引用称为右值引用,使用&&来绑定。
1 int& left=42; //错误,左值引用必须绑定到左值上 2 int n=42; 3 int& left=n; //正确 4 const int& left=42; //正确,左值引用的一种特殊情况,可以将const的左值引用绑定到右值上 5 6 int&& right=42; //正确,右值引用必须绑定到右值上 7 int&& right=n+42; //正确,右值引用绑定到临时对象上
2)左值持久,右值短暂:左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时变量。右值引用指向将要被销毁的对象
3.move函数
1)std::move用来获得绑定到左值的右值引用,头文件<utility>,一般不省略std::(避免名字冲突)
int&& right=std::move(n);
2)调用move就意味着对编译器承诺:除了对源左值赋值和销毁之外,我们不对它进行其他任何操作
int main() { int n = 5; int&& right = std::move(n); cout << right << endl; //输出:5 cout << n << endl; //输出:5 int num = std::move(n); //将得到的右值引用赋给一个左值,对于内置类型,源左值依然有效 cout << num << endl; //输出:5 cout << n << endl; //输出:5 string temp = "hehe"; string&& rig = std::move(temp); cout << rig << endl; //输出:hehe cout << temp << endl; //输出:hehe string str = std::move(temp); //将得到的右值引用赋给一个左值,对于类类型,源左值被清空 cout << str << endl; //输出:hehe cout << temp << endl; //输出:空 return 0; }
运行结果: