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 等)时能显著减少不必要的内存分配和拷贝开销。

浙公网安备 33010602011771号