当前位置: 首页 > 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.xdnf.cn/news/1353493.html

相关文章:

  • 用 Go + GitHub Models API 打造一个免费的 ChatBot
  • 全面解析JVM预热:原理、价值与实践指南
  • MYSQL-约束
  • 【数据结构】线性表——链表
  • 微服务的编程测评系统15-头像上传-OSS
  • 高阶数据结构---ST表
  • kafaka知识要点
  • VLOOKUP专题训练
  • UE C++ 堆化
  • windows中bat脚本的一些操作(三)
  • 算法第五十五天:图论part05(第十一章)
  • 图论与最短路学习笔记
  • 【数据结构】跳表的概率模型详解与其 C 代码实现
  • 深度学习开篇
  • `strlen` 字符串长度函数
  • python 字典有序性的实现和OrderedDict
  • 计算机网络 各版本TLS握手的详细过程
  • 电脑零广告快响应提速(一)之卸载搜狗输入法使用RIME—东方仙盟
  • python re模块常用方法
  • MySQL详细介绍指南
  • 蓝牙aoa仓库管理系统功能介绍
  • [e3nn] 归一化 | BatchNorm normalize2mom
  • 【技术突破】动态目标误检率↓83.5%!陌讯多模态融合算法在智慧城管的实战优化
  • 基于电力电子变压器的高压脉冲电源方案复现
  • 使用 Certbot 申请 Apache 证书配置棘手问题
  • 【数据结构】计数排序:有时比快排还快的整数排序法
  • Ubuntu 操作系统深度解析:从入门到精通(2025 最新版)
  • Java JVM 超级详细指南
  • 在Linux环境中为Jupyter Lab安装Node.js环境
  • 云计算之云主机Linux是什么?有何配置?如何选?