C++11 右值引用与移动语义

基础:什么是左值和右值?

  • 左值(lvalue):有名字、有地址、可以被反复使用的值,比如变量 v1
  • 右值(rvalue):临时的、用完即弃的值,比如 Intvec(33) 这种临时对象

问题:拷贝赋值的浪费

当你把一个右值赋给另一个变量时,传统的拷贝赋值操作符会这样做:

v2 = Intvec(33)
① 创建临时对象 Intvec(33)          ← 构造器
② 进入 operator=,再创建一个临时副本  ← 拷贝构造器
③ 把副本的内容 swap 给 v2
④ 销毁内部临时副本                  ← 析构器
⑤ 销毁原始临时对象 Intvec(33)       ← 析构器

明明右值用完就扔,却还要老老实实深拷贝一份,非常浪费。

解决:移动赋值操作符

C++11 引入 &&(右值引用),允许我们写一个专门处理右值的 operator=

Intvec& operator=(Intvec&& other)
{
    std::swap(m_size, other.m_size);
    std::swap(m_data, other.m_data);  // 直接"偷"走指针!
    return *this;
}

核心思路:既然右值反正要被销毁,不如直接把它的内部数据指针交换过来,而不是重新分配内存复制数据。

执行流程变为:

① 创建临时对象 Intvec(33)    ← 构造器
② 进入移动 operator=,直接 swap 指针
③ 销毁临时对象(内容已被"偷走")← 析构器

省掉了一次完整的拷贝构造和析构,性能大幅提升,在数据量大时尤为明显。

一句话总结

移动语义的本质是:对于那些"反正要销毁"的临时对象,与其复制它的数据,不如直接把数据偷过来,让它销毁时带走的是空壳。

这在处理大型容器(vector、string 等)时能显著减少不必要的内存分配和拷贝开销。

posted @ 2026-04-02 09:33  coconutut  阅读(28)  评论(0)    收藏  举报