右值引用和移动语义是C++11核心特性,通过绑定临时对象、转移资源指针避免深拷贝,显著提升vector等大对象性能;需手动实现移动构造/赋值函数,参数为T&&,内部用std::move转移成员,原对象置空后仅可析构或赋值。
右值引用和移动语义是 C++11 引入的核心特性,它们让程序能避免不必要的深拷贝,把临时对象的资源“偷过来”直接复用,显著提升性能——尤其在处理大对象(如 vector、string、自定义容器)时效果明显。
右值引用用 && 表示,只能绑定到即将销毁的表达式(如字面量、函数返回的临时对象、std::move 转换后的对象),不能绑定到具名变量(左值)。它本身是个左值,但标记了“可被移动”的意图。
例如:
string s1 = "hello";编译器不会自动生成移动函数(除非类没有自定义析构/拷贝/赋值,且所有成员都可移动)。你需要手动定义,把源对象的内部指针(如 char*、int*、vector::data())直接接管,再将源对象的指针置为 nullptr,防止析构时重复释放。
典型写法要点:
data_ = std::move(other.data_))
态(比如指针为空),后续仅可安全析构或赋值假设函数返回一个局部 vector:
vector如果没有移动语义,return 会触发一次深拷贝(分配新内存 + 逐个复制元素),耗时且占内存;有了移动语义,只是交换两个 vector 的内部指针和大小信息,开销接近 O(1)。
编译器在满足条件时会隐式调用移动函数,常见于:
vector v{string("a"), string("b")} )但以下情况不会自动移动: