【C++】023、移动语义深拷贝
一、移动语言是如何解决深拷贝的性能问题深拷贝会复制整个底层数据让源对象和目标对象都拥有自己独立的堆内存空间移动语义是转换底层资源的所有权将源对象的指针指向目标对象而不赋值底层数据时间复杂都为1移动语义将源对象的资源指针移动到目标对象并将源对象指针设置为nullptr这样源对象的析构操作就不会释放已经释放的资源了。二、代码示例移动构造函数与移动赋值操作符函数实现#include iostream #include cstring class MyString { private: char* m_data; size_t m_len; public: // ---------- 构造函数 ---------- MyString(const char* str ) : m_len(strlen(str)), m_data(new char[m_len 1]) { strcpy(m_data, str); } // ---------- 析构函数 ---------- ~MyString() { delete[] m_data; // 如果 m_data 是 nullptr安全无操作 } // // 1. 深拷贝构造O(n)昂贵 // MyString(const MyString other) : m_len(other.m_len), m_data(new char[m_len 1]) { strcpy(m_data, other.m_data); // 申请内存 复制数据 std::cout 深拷贝构造耗时 O(n) std::endl; } // // 2. 移动构造O(1)零开销 // MyString(MyString other) noexcept : m_data(other.m_data) // ① 窃取指针只复制地址 , m_len(other.m_len) { // ② 窃取长度 other.m_data nullptr; // ③ 关键置空源对象切断所有权 other.m_len 0; std::cout 移动构造O(1) 指针交换未复制任何数据 std::endl; } // // 3. 移动赋值O(1)对比深拷贝赋值 // MyString operator(MyString other) noexcept { if (this ! other) { delete[] m_data; // 释放自己的旧资源如果有 m_data other.m_data; // 窃取指针 m_len other.m_len; other.m_data nullptr; // 置空源对象 other.m_len 0; std::cout 移动赋值O(1) std::endl; } return *this; } };外部调用代码int main() { std::cout 场景1拷贝构造 vs 移动构造 std::endl; { MyString s1(HelloWorld); // 1. 普通构造分配堆内存 MyString s2(s1); // 2. 深拷贝构造申请新内存 复制10个字符 MyString s3(std::move(s1)); // 3. 移动构造只交换指针O(1) // 注意s1 现在是一个空壳m_data nullptr不能再读取其内容 // 如果取消下面这行注释程序会崩溃访问空指针。 // std::cout s1 内容: s1.c_str() std::endl; std::cout s2 内容: s2.c_str() (独立内存) std::endl; std::cout s3 内容: s3.c_str() (窃取了 s1 的资源) std::endl; } // 作用域结束s1(空)、s2、s3 各自析构不会双重释放 std::cout std::endl;三、移动语义操作中置空源对象的原因1、防止双重释放如果源对象的析构函数被调用时m_data还指向原来的地址他就会delete[]这块内存而目标对象也指向这块地址两个析构先后释放同一块内存进程立即崩溃。2、保证析构安全置空后源对象的析构函数执行delete[] m_data由于m_data是nullpdelete[]是无害的空操作。四、移动构造函数使用noexcept的原因C标准库承诺vector扩容必须提供强异常安全保证也就是扩容过程中如果抛出异常程序的状态必须安全地恢复到扩容前的状态但是移动构造函数会将源对象置为空了无法恢复所以加noexcept相当于向编译器承诺此操作不会抛异常让stl容器放心地使用移动从而达到最高性能。

相关新闻

Kafka自动提交位移机制深度解析:原理、陷阱与最佳实践

Kafka自动提交位移机制深度解析:原理、陷阱与最佳实践

1. 从一次线上事故说起:自动提交的“静默”陷阱那天晚上,报警系统突然响起,提示我们的一个核心数据同步服务出现了严重的消息积压。登录监控一看,消费者组的Lag(滞后量)曲线像坐了火箭一样直线飙升&#xf…

2026/10/13 10:39:51 阅读更多 →
第1章:OpenJDK 术语全景与 JVM 架构原理

第1章:OpenJDK 术语全景与 JVM 架构原理

1. 项目背景 业务场景:某电商公司的订单系统在"双十一"大促期间频繁出现 Full GC 停顿,P99 延迟从日常的 50ms 飙升至 3000ms。运维团队紧急扩容 20 台机器才勉强扛住流量。事后复盘会上,开发说"堆内存不够"&#xff0c…

2026/10/12 22:21:40 阅读更多 →
海思Hi3798MV100 SDK编译环境搭建与实战指南

海思Hi3798MV100 SDK编译环境搭建与实战指南

1. 项目概述:从零开始构建Hi3798MV100开发环境拿到一块搭载海思Hi3798MV100芯片的开发板或者机顶盒,第一件要干的事是什么?刷机?跑Demo?不,对于开发者而言,最基础也是最关键的一步,是…

2026/10/8 21:59:05 阅读更多 →

最新新闻

最佳接收全解析:从匹配滤波到瑞利衰落,三种信号场景的接收机设计指南

最佳接收全解析:从匹配滤波到瑞利衰落,三种信号场景的接收机设计指南

写在前面的几句话做接收机设计这些年,我最大的感受是:教科书里"最佳接收"这一章,看起来全是数学推导,其实每一个结论背后都是一个非常具体的工程决策。你在调试时遇到的误码率比理论差几个dB、同步环路不稳、门限设了跟…

2026/10/13 10:40:26 阅读更多 →
Java实战验证库:203个JDK17可运行示例与故障复现现场

Java实战验证库:203个JDK17可运行示例与故障复现现场

简介:本资源是《Java for Programmers 第二版》配套的完整示例代码集,专为具备编程基础、正系统学习Java的开发者设计,旨在通过可运行的实践案例深化对Java核心机制的理解与应用。压缩包为RAR格式,共34.9MB,涵盖从基础…

2026/10/13 10:40:26 阅读更多 →
专科毕业论文AI辅助全流程:9个平台从选题到答辩的实用拆解

专科毕业论文AI辅助全流程:9个平台从选题到答辩的实用拆解

1. 别急着骂AI,先搞清楚专科毕业论文的真相 每年到三四月份,我就会被各种学弟学妹的私信轰炸,问题出奇一致:学长,专科毕业论文到底怎么搞?不会写、没思路、导师催、查重高,四座大山压下来&#…

2026/10/13 10:40:26 阅读更多 →
Git Worktree 实操:一套仓库多个工作目录,彻底告别分支切换之痛

Git Worktree 实操:一套仓库多个工作目录,彻底告别分支切换之痛

平时在项目里同时推进多个分支时,最烦人的不是写代码本身,而是 Git 的切换成本。一个仓库默认只有一个工作区,你想看看另一个分支,就得先 stash 或者 commit 当前改动,然后 checkout 过去,忙完再切回来&…

2026/10/13 10:40:26 阅读更多 →
SpringBoot+Vue前后端分离宽带业务管理系统源码实战解析

SpringBoot+Vue前后端分离宽带业务管理系统源码实战解析

1. 项目核心价值:为什么你需要一套宽带业务管理系统 做后台管理系统开发的朋友,应该都有过这种经历:面试官让你写一个XX管理系统,或者公司内部要快速搭一套业务支撑平台,结果你从零开始设计数据库表结构、写权限拦截器…

2026/10/13 10:40:26 阅读更多 →
以太坊幽灵交易根因与Nonce管理实战:从卡死到自动化防护

以太坊幽灵交易根因与Nonce管理实战:从卡死到自动化防护

凌晨三点十七分,监控大屏的告警把值班手机震醒。点开一看,某资金归集服务最近的链上交易数为零,进程却还活着,日志里没有任何异常。刷新区块浏览器,交易列表躺着一串 pending,确认数全是零。再往下翻&#…

2026/10/13 10:39:24 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →