C++法则12:右值引用的核心目的:支持移动语义(Move Semantics)
右值引用(Rvalue Reference)是C++11引入的最重要特性之一,其主要设计目的就是支持移动语义(Move Semantics)。
移动语义的核心思想
移动语义允许资源(如动态内存、文件句柄等)从一个对象"移动"到另一个对象,而非传统的复制。这避免了不必要的深拷贝,显著提高了性能。
右值引用语法
右值引用使用双&&
表示:
Type&& variable = rvalue_expression;
为什么需要右值引用
-
区分左值和右值:右值引用让我们能够在语言层面区分临时对象(右值)和持久对象(左值)
-
资源转移而非复制:对于即将销毁的临时对象,我们可以安全地"窃取"其资源
移动构造函数和移动赋值运算符
class MyString {
public:// 移动构造函数MyString(MyString&& other) noexcept : data_(other.data_), size_(other.size_) {other.data_ = nullptr; // 源对象置空other.size_ = 0;}// 移动赋值运算符MyString& operator=(MyString&& other) noexcept {if (this != &other) {delete[] data_; // 释放现有资源data_ = other.data_; // 接管资源size_ = other.size_;other.data_ = nullptr;other.size_ = 0;}return *this;}private:char* data_;size_t size_;
};
std::move
std::move
将左值转换为右值引用,表示该对象可以被移动:
MyString s1("Hello"); MyString s2 = std::move(s1); // 调用移动构造函数
移动语义的优势
-
性能提升:避免了不必要的深拷贝
-
支持不可复制但可移动的类型(如
std::unique_ptr
) -
完美转发的基础(结合转发引用)