现代 CC11 及以后的移动语义Move Semantics核心就是一句话把一个对象“里的资源”直接转给另一个对象而不是复制一份。1. 一句话解释- 拷贝把对象内容复制一份两个对象各有一套资源。- 移动把原对象的资源直接“抢过来”原对象变成空/无效状态不复制内存。适合场景对象马上就要被销毁临时对象、函数返回值没必要完整拷贝直接拿走资源更快。2. 关键概念1右值 左值- 左值有名字、能取地址能多次使用如变量- 右值临时值用完就丢如 a b 、 函数返回值 移动语义就是专门用来优化右值的。2右值引用 T用来标记“可以被移动”的对象cppint a 10; // 10 是临时值用右值引用绑定3移动构造 / 移动赋值类里新增两个特殊成员函数接管资源cpp// 移动构造MyClass(MyClass other) noexcept {// 直接拿走 other 的指针/资源data_ other.data_;other.data_ nullptr; // 原对象置空}// 移动赋值MyClass operator(MyClass other) noexcept {// 释放自身资源// 拿走 other 资源// 置空 otherreturn *this;}4 std::move把左值强行转成右值告诉编译器“我不用这个对象了你可以移动它。”cppMyClass a;MyClass b std::move(a); // 移动不是拷贝3. 为什么要用移动语义对带堆内存、大容器的对象性能提升巨大- vectorstring 、 string 、 unique_ptr 等- 函数返回大对象时不再深拷贝直接移动以前 C98 只能靠返回值优化RVO现在移动语义是语言级保证。4. 简单对比示例cppstring a hello;string b a; // 拷贝慢string c move(a); // 移动快a 变为空5. 总结- 移动语义 资源转移而非复制- 靠 T 、移动构造/赋值、 std::move 实现- 大幅提升临时对象、返回值、容器性能- STL 容器vector/string/map 等默认都支持移动
现代 C++(C++11 及以后)的移动语义
发布时间:2026/6/3 21:57:06
现代 CC11 及以后的移动语义Move Semantics核心就是一句话把一个对象“里的资源”直接转给另一个对象而不是复制一份。1. 一句话解释- 拷贝把对象内容复制一份两个对象各有一套资源。- 移动把原对象的资源直接“抢过来”原对象变成空/无效状态不复制内存。适合场景对象马上就要被销毁临时对象、函数返回值没必要完整拷贝直接拿走资源更快。2. 关键概念1右值 左值- 左值有名字、能取地址能多次使用如变量- 右值临时值用完就丢如 a b 、 函数返回值 移动语义就是专门用来优化右值的。2右值引用 T用来标记“可以被移动”的对象cppint a 10; // 10 是临时值用右值引用绑定3移动构造 / 移动赋值类里新增两个特殊成员函数接管资源cpp// 移动构造MyClass(MyClass other) noexcept {// 直接拿走 other 的指针/资源data_ other.data_;other.data_ nullptr; // 原对象置空}// 移动赋值MyClass operator(MyClass other) noexcept {// 释放自身资源// 拿走 other 资源// 置空 otherreturn *this;}4 std::move把左值强行转成右值告诉编译器“我不用这个对象了你可以移动它。”cppMyClass a;MyClass b std::move(a); // 移动不是拷贝3. 为什么要用移动语义对带堆内存、大容器的对象性能提升巨大- vectorstring 、 string 、 unique_ptr 等- 函数返回大对象时不再深拷贝直接移动以前 C98 只能靠返回值优化RVO现在移动语义是语言级保证。4. 简单对比示例cppstring a hello;string b a; // 拷贝慢string c move(a); // 移动快a 变为空5. 总结- 移动语义 资源转移而非复制- 靠 T 、移动构造/赋值、 std::move 实现- 大幅提升临时对象、返回值、容器性能- STL 容器vector/string/map 等默认都支持移动