C++ 移动语义与右值引用实战
移动语义避免不必要的拷贝,提升性能,是 C++11 最重要的特性之一。
1. 左值与右值
- 左值:有地址的变量(如
int a = 5;中的a)。 - 右值:临时对象或字面量(如
5,func()返回值)。
2. 移动构造函数与移动赋值
class MyString {
char* data;
public:
// 移动构造函数
MyString(MyString&& other) noexcept : data(other.data) {
other.data = nullptr;
}
// 移动赋值
MyString& operator=(MyString&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data;
other.data = nullptr;
}
return *this;
}
};3. std::move 与 std::forward
std::move将左值转为右值引用,用于移动语义。std::forward完美转发,保持参数原始类型。
std::vector<int> v1 = {1,2,3};
std::vector<int> v2 = std::move(v1); // 移动,v1 变为空4. 编译器优化的返回值优化(RVO/NRVO)
现代编译器会省略拷贝,即使没有移动语义也能优化。
