C++(移动构造、移动赋值、完美转发)

这三个是 C++11 最重要的特性,核心目的是减少不必要的内存拷贝,提升程序性能。我用最清晰、最实用的方式给你讲透,包含定义、代码、区别和用法。

前置知识:左值 & 右值

左值:可以取地址、有名字的变量(如 int a=10; a 是左值)

右值:临时值,不能取地址、用完就销毁(如 10、函数返回值)

C++11 用 && 表示右值引用,专门绑定临时对象,这是移动语义的基础。

右值引用 = 专门用来偷临时对象资源的。

1. 移动构造函数 (Move Constructor)

作用:

把一个临时右值对象的资源直接转移给新对象,不拷贝内存,速度极快。

类名(类名&& 其他对象) noexcept;

  • 移动构造不分配新内存,直接接管临时对象的资源
  • 必须把原对象的指针置空,避免双重释放
  • 比拷贝构造快成千上万倍(尤其大对象 / 容器)

2. 移动赋值运算符 (Move Assignment)

类名& operator=(类名&& 其他对象) noexcept;

3. 完美转发 (Perfect Forwarding)

作用:

在函数模板中,完整保留参数的左值 / 右值属性,原封不动转发给其他函数,不产生额外拷贝。

解决痛点:

模板传参时,右值容易被变成左值,导致调用拷贝而非移动。

三者对比:

特性 移动构造 移动赋值 完美转发
用途 创建新对象时转移资源 给已有对象转移资源 函数模板保持参数类型不变地转发
语法 A(A&&) A& operator=(A&&) std::forward<T>()
性能 极快,无拷贝 极快,无拷贝 零开销,无拷贝
适用对象 临时右值 临时右值 任意类型(左值 + 右值)
必须置空源对象?
相关推荐
用户4026924481908几秒前
CRMEB Pro 新增后台接口全链路:路由、权限、验证器、返回格式一次讲清
前端·后端
郝学胜_神的一滴6 分钟前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
泉城老铁22 分钟前
springboot+vue+ ffmpeg 实现视频的拉流播放
前端
PedroQue991 小时前
uni-router v1.8.0新增冷启动守卫补执行
前端·uni-app
xiaok1 小时前
部署之后,本地浏览器还在读取旧缓存导致页面一直显示loading中
前端
用户059540174461 小时前
Redis缓存一致性踩坑实录:线上故障排查6小时,我用pytest+内存快照把它永久关进了笼子
前端·css
星栈1 小时前
我用 Rust + Dioxus 做了个全栈跨平台笔记应用:第一版先把列表和详情跑通
前端·rust·前端框架
用户1733598075371 小时前
Vue 3 SPA 首屏优化:从 3s 到 1.2s 的 5 个实践
前端·vue.js
咖啡无伴侣1 小时前
基础骨架:30 分钟搭好 pnpm workspace,完成双项目 Monorepo 迁入
前端
谷无姜1 小时前
Webpack5 进阶思考:那些官方文档没讲清楚的事
前端·webpack