深入了解c++11 移动语义与右值引用
C++11 中引入的移动语义和右值引用是两个非常重要的概念,它们可以帮助我们更好地理解和学习 C++,提高程序的性能和效率。
一、移动语义
移动语义是 C++11 中一个最主要的特性之一,它提供了移动而非拷贝对象的能力。在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升性能。
例如,在以下程序中,我们可以看到对象拷贝的过程:
```cpp
#include <iostream>
#include <vector>
using namespace std;
class Obj {
public:
Obj() { cout << "create obj" << endl; }
Obj(const Obj& other) { cout << "copy create obj" << endl; }
};
vector<Obj> foo() {
vector<Obj> c;
c.push_back(Obj());
cout << "---- exit foo ----" << endl;
return c;
}
int main() {
vector<Obj> v;
v = foo();
}
```
编译并运行后,我们可以看到对象执行了两次拷贝构造。
但是,在 C++11 中,我们可以使用移动语义来避免第二次拷贝构造。
二、右值引用
右值引用是 C++11 中引入的一种新的引用类型,它必须绑定到右值上。使用 `&&` 来获取右值引用。
右值引用可以绑定到右值上,例如:
```cpp
int i = 42;
int&& rr = i * 42; // 正确,将rr绑定到乘法结果上
```
而左值引用则可以绑定到左值上,例如:
```cpp
int i = 42;
int& r = i; // 正确,左值引用
```
左值和右值的区别在于:
* 左值一般是可寻址的变量,右值一般是不可寻址的字面常量或者是在表达式求值过程中创建的可寻址的无名临时对象。
* 左值具有持久性,右值具有短暂性。
移动语义和右值引用是 C++11 中两个非常重要的概念,它们可以帮助我们更好地理解和学习 C++,提高程序的性能和效率。