54 C++ 现代C++编程艺术3-移动构造函数

C++ 现代C++编程艺术3-移动构造函数

文章目录

  • C++ 现代C++编程艺术3-移动构造函数

场景1:动态数组资源转移

#include <iostream>  
#include <vector>  class DynamicArray {  int* data;  size_t size;  
public:  // 移动构造函数(关键实现)  DynamicArray(DynamicArray&& other) noexcept  : data(other.data), size(other.size) {  other.data = nullptr;  // 切断原对象资源所有权  other.size = 0;  std::cout << "移动构造触发\n";  }  // 传统深拷贝构造(对比用)  DynamicArray(const DynamicArray& other) : size(other.size) {  data = new int[size];  memcpy(data, other.data, size * sizeof(int));  std::cout << "深拷贝构造触发\n";  }  // 构造函数与析构函数  DynamicArray(size_t s) : size(s), data(new int[s]) {}  ~DynamicArray() { delete[] data; }  
};  // 使用场景  
int main() {  DynamicArray arr1(1e6);  // 创建含100万个int的数组  // 场景A:触发移动构造  DynamicArray arr2 = std::move(arr1);  // 无内存复制  // 场景B:触发深拷贝构造(对比)  DynamicArray arr3 = arr2;             // 需要复制100万int  // 场景C:STL容器优化  std::vector<DynamicArray> vec;  vec.push_back(DynamicArray(1e6));  // 自动调用移动构造(无拷贝)  
}  

输出结果:

移动构造触发  
深拷贝构造触发  
移动构造触发  

场景2:文件句柄所有权转移

#include <fstream>  class FileWrapper {  std::fstream file;  
public:  // 移动构造函数  FileWrapper(FileWrapper&& other) noexcept : file(std::move(other.file)) {  std::cout << "文件句柄已转移\n";  }  explicit FileWrapper(const std::string& path) {  file.open(path, std::ios::in);  }  // 禁用拷贝  FileWrapper(const FileWrapper&) = delete;  
};  void processFile(FileWrapper f) { /* 文件处理逻辑 */ }  int main() {  FileWrapper f1("data.txt");  processFile(std::move(f1));  // 转移句柄所有权  // 此时f1.file 已处于关闭状态  
}  

场景3:高性能字符串拼接

class StringBuilder {  char* buffer;  size_t capacity;  
public:  // 移动构造函数  StringBuilder(StringBuilder&& src) noexcept  : buffer(src.buffer), capacity(src.capacity) {  src.buffer = nullptr;  src.capacity = 0;  }  StringBuilder operator+(StringBuilder&& rhs) {  // 移动语义实现高效拼接  this->append(std::move(rhs));  return std::move(*this);  }  
};  // 使用示例  
StringBuilder s1 = StringBuilder(100);  
StringBuilder s2 = StringBuilder(200);  
auto s3 = s1 + std::move(s2);  // 零拷贝拼接  

关键原理总结

操作类型资源行为时间复杂度适用场景
深拷贝构造完全复制资源O(n)需要独立副本的对象
移动构造指针/句柄所有权转移O(1)临时对象、大型资源转移

开发注意事项

  1. noexcept声明:移动构造函数必须标记noexcept,否则STL容器(如vector扩容)仍会使用拷贝
  2. 对象状态管理:移动后的源对象应处于可析构但不可用的状态(如指针置空)
  3. 与右值引用联动:通过std::move或返回临时对象触发移动语义
  4. 禁用拷贝控制:对不可复制的资源(如文件锁),需同时=delete拷贝构造函数

性能实测对比(1GB数据操作)

操作耗时(ms)内存峰值(MB)
传统拷贝构造22002048
移动构造0.51024

通过移动构造可降低 99.98% 的时间消耗和 50% 的内存占用(测试环境:Intel i7-12700K,32GB DDR5)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94072.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sping Boot + RabbitMQ :如何在Spring Boot中整合RabbitMQ实现消息可靠投递?

Spring Boot整合RabbitMQ实现消息可靠投递全解析 在分布式系统中&#xff0c;消息中间件是解耦、异步、流量削峰的核心组件。RabbitMQ作为高可靠、易扩展的AMQP协议实现&#xff0c;被广泛应用于企业级场景。但消息传递过程中可能因网络波动、服务宕机等问题导致消息丢失&#…

STAR-CCM+|K-epsilon湍流模型溯源

【1】引言 三维CFD仿真经典软件很多&#xff0c;我接触过的有Ansys和STAR-CCM两种。因为一些机缘&#xff0c;我使用STAR-CCM更多&#xff0c;今天就来回顾一下STAR-CCM中K-epsilon湍流模型的基本定义。 【2】学习地址介绍 点击链接User Guide可以到达网页版本的STAR-CCM 24…

osgEarth 图像融合正片叠底

* 需求&#xff1a;* 高程渲染图 RGB.tif、 山体阴影图 AMP.tif** 高程渲染图 rgb波段分别 乘以 山体阴影图r波段&#xff0c; 然后除以255(AI说 读取的纹理就已经归一化到了 0~1 范围&#xff0c;不用除以 255)。本人遥感知识匮乏。问了AI,以上 需求在许多商业软件上已实现。…

Java接口响应速度优化

在 Java 开发中&#xff0c;接口响应速度直接影响用户体验和系统吞吐量。优化接口性能需要从代码、数据库、缓存、架构等多个维度综合考量&#xff0c;以下是具体方案及详细解析&#xff1a;一、代码层面优化代码是接口性能的基础&#xff0c;低效的代码会直接导致响应缓慢。1.…

A Large Scale Synthetic Graph Dataset Generation Framework的学习笔记

文章的简介 作者提出了一个可扩展的合成图生成框架&#xff0c;能够从真实图中学习结构和特征分布&#xff0c;并生成任意规模的图数据集&#xff0c;支持&#xff1a; 节点和边的结构生成节点和边的特征生成特征与结构的对齐&#xff08;Aligner&#xff09; 它区别于GraphWor…

Android12 Framework读写prop属性selinux报错解决

文章目录问题描述解决过程相关文章问题描述 Android读prop值时&#xff0c;就算是system应用&#xff0c; 也需要selinux权限&#xff0c;否则会报错。 java代码如下 SystemProperties.get("ro.input.resampling", "")selinux报错如下 2025-06-28 17:57:…

【图文版】AIOT 小智 AI 聊天机器人 ESP32 项目源码图解

前言 小智 AI 聊天机器人是最近一个很火的开源项目&#xff0c;它借助LLM大模型以及TTS等AI的能力&#xff0c;通过自然语言来与其对话实现交互。它可以回答任何问题、播放音乐、背诵古诗&#xff0c;颇有未来AI机器人的雏形。 因为最近工作上的需要对其进行了研究&#xff0c;…

250821-RHEL9.4上Docker及Docker-Compose的离线安装

在 离线环境下 在 RHEL (Red Hat Enterprise Linux) 系统上安装 Docker 和 Docker Compose&#xff0c;需要提前在有网络的环境中下载相关 RPM 包及依赖&#xff0c;然后在目标机器上进行安装。以下是比较完整的步骤&#xff1a; 1. Docker及Docker-Compose离线安装 在 RHEL 9.…

react相关知识

1.类组件和函数组件&#xff08;1&#xff09;类组件import React, { Component } from react;class UserProfile extends Component {constructor(props) {super(props);this.state {userData: null,isLoading: true,};this.timerId null;}componentDidMount() {// 模拟 API…

算法第五十五天:图论part05(第十一章)

并查集理论基础并查集主要有两个功能&#xff1a;将两个元素添加到一个集合中。判断两个元素在不在同一个集合class UnionFind:def __init__(self, n):"""初始化并查集"""self.n nself.father list(range(n)) # 每个节点自己是根self.rank […

雨雾天气漏检率骤降80%!陌讯多模态车牌识别方案实战解析

一、行业痛点&#xff1a;车牌识别的天气敏感性据《智慧交通系统检测白皮书》统计&#xff0c;雨雾环境下传统车牌识别漏检率高达42.7%&#xff08;2024年数据&#xff09;。主要存在三大技术瓶颈&#xff1a;1.​​水膜干扰​​&#xff1a;挡风玻璃水渍导致车牌区域纹理模糊2…

PostgreSQL15——查询详解

PostgreSQL15查询详解一、简单查询1.1、单表查询1.2、无表查询1.3、消除重复结果1.4、使用注释二、查询条件2.1、WHERE子句2.2、模式匹配2.3、空值判断2.4、复杂条件三、排序显示3.1、单列排序3.2、多列排序3.3、空值排序四、限定结果数量4.1、Top-N查询4.2、分页查询4.3、注意…

03-容器数据卷

卷就是目录或文件&#xff0c;存在于一个或多个容器中&#xff0c;由 docker 挂载到容器&#xff0c;但不属于联合文件系统&#xff0c;因此能够绕过 UnionFS&#xff0c;提供一些用于持续存储或共享数据。 特性&#xff1a;卷设计的目的就是数据的持久化&#xff0c;完全独立于…

Linux内核进程管理子系统有什么第三十三回 —— 进程主结构详解(29)

接前一篇文章&#xff1a;Linux内核进程管理子系统有什么第三十二回 —— 进程主结构详解&#xff08;28&#xff09; 本文内容参考&#xff1a; Linux内核进程管理专题报告_linux rseq-CSDN博客 《趣谈Linux操作系统 核心原理篇&#xff1a;第三部分 进程管理》—— 刘超 《…

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

文章目录 1. 前言:当一个任务有多个目标 2. 目标导向的强化学习 (GoRL) 简介 3. HER算法:化失败为成功的智慧 4. 代码实践:用PyTorch实现HER+DDPG 4.1 自定义环境 (WorldEnv) 4.2 智能体与算法 (DDPG) 4.3 HER的核心:轨迹经验回放 4.4 主流程与训练 5. 训练结果与分析 6. 总…

前端 H5分片上传 vue实现大文件

用uniapp开发APP上传视频文件&#xff0c;大文件可以上传成功&#xff0c;但是一旦打包为H5的代码&#xff0c;就会一提示链接超时&#xff0c;我的代码中是实现的上传到阿里云 如果需要看全文的私信我 官方开发文档地址 前端&#xff1a;使用分片上传的方式上传大文件_对象…

Linux服务器Systemctl命令详细使用指南

目录 1. 基本语法 2. 基础命令速查表 3. 常用示例 3.1 部署新服务后&#xff0c;设置开机自启并启动 3.2 检查系统中所有失败的服务并尝试修复 3.3 查看系统中所有开机自启的服务 4. 总结 以下是 systemctl 使用指南&#xff0c;涵盖服务管理、单元操作、运行级别控制、…

【JVM内存结构系列】二、线程私有区域详解:程序计数器、虚拟机栈、本地方法栈——搞懂栈溢出与线程隔离

上一篇文章我们搭建了JVM内存结构的整体框架,知道程序计数器、虚拟机栈、本地方法栈属于“线程私有区域”——每个线程启动时会单独分配内存,线程结束后内存直接释放,无需GC参与。这三个区域看似“小众”,却是理解线程执行逻辑、排查栈溢出异常的关键,也是面试中高频被问的…

红帽认证升级华为openEuler证书活动!

如果您有红帽证书&#xff0c;可以升级以下相应的证书&#xff1a;&#x1f447; 有RHCSA证书&#xff0c;可以99元升级openEuler HCIA 有RHCE证书&#xff0c;可以99元升级openEuler HCIP 有RHCA证书&#xff0c;可以2100元升级openEuler HCIE 现金激励&#xff1a;&#x1f4…

迭代器模式与几个经典的C++实现

迭代器模式详解1. 定义与意图迭代器模式&#xff08;Iterator Pattern&#xff09; 是一种行为设计模式&#xff0c;它提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。主要意图&#xff1a;为不同的聚合结构提供统一的遍历接口。将遍历…