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>()
性能 极快,无拷贝 极快,无拷贝 零开销,无拷贝
适用对象 临时右值 临时右值 任意类型(左值 + 右值)
必须置空源对象?
相关推荐
蒸蒸yyyyzwd19 分钟前
cpp 选手秋招学习笔记 day37 面经学习
c++·八股
前端snow21 分钟前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林81824 分钟前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007824 分钟前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端
Z小明28 分钟前
第 6 章 组件进阶
前端·vue.js
江华森30 分钟前
HTTP请求的完整过程详解:从DNS解析到TCP挥手的微秒级实战分析
前端
南青31 分钟前
Vue 3 中后台实战:我踩过的 10 个坑和最佳实践
前端
江华森33 分钟前
HTTPS协议详解——SSL/TLS握手、证书与加密通信
前端
YYYing.35 分钟前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
江华森39 分钟前
从一个HTTP请求看网络分层原理:基于华为云ECS的真实抓包实战
前端