现代 C++(C++11 及以后)的移动语义

现代 C++(C++11 及以后)的移动语义(Move Semantics),核心就是一句话:

把一个对象"里的资源"直接转给另一个对象,而不是复制一份。

  1. 一句话解释
  • 拷贝:把对象内容复制一份,两个对象各有一套资源。

  • 移动:把原对象的资源直接"抢过来",原对象变成空/无效状态,不复制内存。

适合场景:

对象马上就要被销毁(临时对象、函数返回值),没必要完整拷贝,直接拿走资源更快。

  1. 关键概念

(1)右值 & 左值

  • 左值:有名字、能取地址,能多次使用(如变量)

  • 右值:临时值,用完就丢(如 a + b 、 函数返回值 )

移动语义就是专门用来优化右值的。

(2)右值引用 T&&

用来标记"可以被移动"的对象:

cpp

int&& a = 10; // 10 是临时值,用右值引用绑定

(3)移动构造 / 移动赋值

类里新增两个特殊成员函数,接管资源:

cpp

// 移动构造

MyClass(MyClass&& other) noexcept {

// 直接拿走 other 的指针/资源

data_ = other.data_;

other.data_ = nullptr; // 原对象置空

}

// 移动赋值

MyClass& operator=(MyClass&& other) noexcept {

// 释放自身资源

// 拿走 other 资源

// 置空 other

return *this;

}

(4) std::move

把左值强行转成右值,告诉编译器:

"我不用这个对象了,你可以移动它。"

cpp

MyClass a;

MyClass b = std::move(a); // 移动,不是拷贝

  1. 为什么要用移动语义?

对带堆内存、大容器的对象性能提升巨大:

  • vector<string> 、 string 、 unique_ptr 等

  • 函数返回大对象时,不再深拷贝,直接移动

以前 C++98 只能靠返回值优化(RVO),现在移动语义是语言级保证。

  1. 简单对比示例

cpp

string a = "hello";

string b = a; // 拷贝,慢

string c = move(a); // 移动,快,a 变为空

  1. 总结
  • 移动语义 = 资源转移,而非复制

  • 靠 T&& 、移动构造/赋值、 std::move 实现

  • 大幅提升临时对象、返回值、容器性能

  • STL 容器(vector/string/map 等)默认都支持移动

相关推荐
莫晓燚25 分钟前
Ansible 13 个常用模块---企业实战
git·github
神仙别闹44 分钟前
基于Python实现英词语自动对齐系统
开发语言·python
唐青枫1 小时前
C 语言 malloc() 详解与实战 Demo
c语言
akinggw1 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
老歌老听老掉牙1 小时前
圆柱端面四平面交线及其在yoz面投影的几何解析与 Python 实现
开发语言·python·平面
繁星蓝雨2 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
女神下凡2 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
旖旎夜光2 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
程序员柒叔2 小时前
Diagram Design 解构:45 种图型如何用语义路由与 SVG 质量门交付
人工智能·github·agent·skills
逛逛GitHub2 小时前
9 个神级 GitHub 项目助你蹭上抖音、小红书 Vibe 知识大赏热点。
github