当前位置: 首页 > news >正文

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.dtcms.com/a/346581.html

相关文章:

  • 园区节能减碳大屏可视化设计指南
  • SpringBoot 快速上手:从环境搭建到 HelloWorld 实战
  • frp+go-mmproxy 实现透明代理的内网穿透
  • Vue3 学习教程,从入门到精通,基于 Vue 3 + Element Plus + ECharts + JavaScript的51购商城项目(45)
  • Intel RealSense D435 深度相机详解
  • 小程序备案话术
  • 文献阅读笔记【物理信息神经网络】:Physics-informed neural networks: A deep learning framework...
  • Kubernetes网络服务全解析
  • 【领码方案】PageData 完整解决方案 · 自引用树全链路提速(1.1版 集成层次树)
  • chapter05_从spring.xml读取Bean
  • 网络编程-基本概念及UDP
  • [Vid-LLM] 功能分类体系 | 视频如何被“观看“ | LLM的主要作用
  • 墨刀原型设计工具操作使用指南及实践操作
  • 微信小程序和uni-app面试问题总结
  • Mysql EXPLAIN详解:从底层原理到性能优化实战
  • 探索 List 的奥秘:自己动手写一个 STL List✨
  • 【Git】分支管理
  • Claude Code GitHub Actions配置(卡在第一部,验证Claude手机号过不了!!!)(跑不通!!!)
  • 服务器常见的漏洞扫描记录参考样例
  • CTFshow Pwn入门 - pwn 19
  • GitLab CI:Auto DevOps 全解析,告别繁琐配置,拥抱自动化未来
  • 网络模型深度解析:CNI、Pod通信与NetworkPolicy
  • Java高级语言特性,注解与反射
  • 肽类药物设计新突破:PepHAR 模型如何用「热点驱动」破解三大核心难题?
  • 百年传承祛湿,循汉方古脉,焕时代生机
  • 旅行足迹App技术架构全解析
  • 【React Native】自定义轮盘(大转盘)组件Wheel
  • Krea Video:Krea AI推出的AI视频生成工具
  • JAVA国际版东郊到家同城按摩服务美容美发私教到店服务系统源码支持Android+IOS+H5
  • 大白话聊一聊,数据结构的基石:数组和链表