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

C++中的拷贝移动

这个问题非常关键。
如果你真正理解了 拷贝 vs 移动,你就算真正进入“现代 C++”世界了。

我给你从底层讲清楚,而且会结合你熟悉的 C# 来对比。


一、什么是“拷贝”(Copy)

先看一个简单例子:

std::string a = "hello";
std::string b = a;

发生了什么?

👉 b 是 a 的“拷贝”


1️⃣ 对于简单类型(int / double)

int a = 10;
int b = a;

内存:

a: 10
b: 10

就是简单复制 4 个字节。


2️⃣ 对于复杂类型(比如 std::string)

std::string 内部大概是这样:

struct string {char* data;size_t size;
};

如果是拷贝构造:

std::string b = a;

它必须:

  1. 分配新的内存
  2. 把字符内容复制过去

这叫:

深拷贝(Deep Copy)

因为:

a.data  ----->  "hello"
b.data  ----->  "hello"   (新分配的一块内存)

两块独立内存。


二、什么是“浅拷贝”(Shallow Copy)

如果只是复制指针:

a.data -----> "hello"
b.data -----> 同一个地址

这叫浅拷贝。

问题是:

  • 两个对象指向同一块内存
  • 析构时会 double free
  • 程序崩溃

所以:

👉 标准库容器几乎都是 深拷贝


三、为什么“拷贝”是个大问题?

假设:

std::vector<std::string> big_data(1000000);

如果你函数返回:

std::vector<std::string> get_data();

没有移动语义时:

  • 创建一个 vector
  • 拷贝 100 万个 string
  • 每个 string 可能还拷贝字符数组

成本巨大。


四、什么是“移动”(Move)—— C++11 的革命

移动的核心思想是:

不复制数据
直接“偷走”资源


看例子:

std::string a = "hello";
std::string b = std::move(a);

此时发生的不是拷贝。

而是:

b.data = a.data
a.data = nullptr

结果:

b -----> "hello"
a -----> 空

没有分配内存
没有复制字符
只是改了指针

这叫:

移动语义(Move Semantics)


五、为什么要“移动”?

核心原因:

减少内存分配
减少数据复制
提高性能

在高性能计算里尤其重要。


六、移动是怎么触发的?

关键是:

std::move()

但更重要的是:

右值(rvalue)

比如:

std::string get()
{return "hello";
}

这里返回的是临时对象。

C++ 会自动用移动构造,而不是拷贝构造。


七、拷贝构造 vs 移动构造

类如果自己管理资源:

class Buffer {
public:Buffer(const Buffer& other);        // 拷贝构造Buffer(Buffer&& other) noexcept;    // 移动构造
};

移动构造的本质:

接管资源
清空原对象

八、和 C# 的巨大差异

C#:

  • class 默认引用语义
  • 变量复制只是复制引用
  • GC 统一管理

C++:

  • 默认是值语义
  • 每个对象都有自己生命周期
  • 性能完全由你控制

九、一个高性能场景对比

C#:

List<int> a = new List<int>();
List<int> b = a;   // 只是复制引用

C++:

std::vector<int> a;
std::vector<int> b = a;  // 真的拷贝整个数组

但如果:

std::vector<int> b = std::move(a);

就是 O(1) 操作。


十、什么时候会发生移动?

✔ 返回临时对象
✔ std::move
✔ 容器扩容时

例如:

std::vector<std::string> v;
v.push_back("hello");

如果触发扩容:

  • 老元素会被移动
  • 而不是拷贝

这就是现代 C++ 快的原因。


十一、总结一句话

拷贝 = 创建一个完整副本(深拷贝)
移动 = 转移资源所有权(不复制数据)

十二、为什么你必须理解这个?

因为:

  • 桌面软件 → 大对象传递频繁
  • 高频计算 → 数据量巨大
  • 多线程 → 对象频繁构造销毁

如果不理解移动语义:

  • 性能会差很多
  • 容易写出低效代码

十三、终极理解公式

拷贝 = 再造一个
移动 = 把原来的给你
http://www.jsqmd.com/news/408695/

相关文章:

  • Python自动化测试框架:Unittest 断言
  • 2026年直线导轨厂家权威推荐榜:天津直线滑台、滚珠丝杠怎么安装、滚珠丝杠的选用、滚珠丝杠精度如何确定选择指南 - 优质品牌商家
  • 【预测模型】粒子群/遗传模拟退火优化BP神经网络(PSOSA-BPNN/GASA-BPNN)的高校学生国际化素质评价模型附Matlab代码
  • 【MySQL】3. MySQL库的操作
  • 一个cuda profile的原理例子
  • 具身智能的终局之战,或许不在四肢,而在心智
  • 【MySQL】4. MySQL表的操作
  • 无害化处理项目如何成功?2026年厂家综合推荐与评价,解决技术选型与运营支持痛点 - 十大品牌推荐
  • [特殊字符] 开工大吉!数据安全,从第一天就稳稳的
  • 接口测试用例的编写
  • 2026年无害化设备厂家推荐:聚焦养殖与市政场景评价,应对成本高昂与操作复杂核心问题 - 十大品牌推荐
  • iOS IPA 安装 Plist 文件生成工具
  • 农业机理模型知多少?
  • 实时会议转文字场景中dify的局限;ai平台的任务配置config设计模式:工厂模式;
  • 2026年全国加氢站设备靠谱厂家汇总 实力强口碑好且适配多场景 更具落地性 - 深度智识库
  • 2026年2月15万级城市SUV实战报告:主流车型综合性能及场景适配度对比 - 十大品牌推荐
  • 阿里云国内云与国际版的区别
  • minio-1.搭建
  • 网卡 介质 交换机
  • 2026年评价高的地图数据标注公司推荐:人工智能数据标注、医疗文本数据标注、图像数据标注、地图标注、大数据标注选择指南 - 优质品牌商家
  • 2026市场新型太空科幻机械舱制造厂家选择秘籍大揭秘,机械舱制造企业有哪些聚焦优质品牌综合实力排行 - 品牌推荐师
  • 【开题答辩全过程】以 前缘农产品销售系统的设计与实现为例,包含答辩的问题和答案
  • 深度学习毕设创新点不用愁!5个实战思路,超实用
  • 2026Deepseek知识库部署优选服务商推荐:私有化部署、模型调优、行业定制全覆盖 - 品牌2025
  • 【开题答辩全过程】以 火车票订票系统为例,包含答辩的问题和答案
  • 闲置瑞祥提货券别浪费!3种正规回收途径实测,新手也能轻松变现 - 京回收小程序
  • 工业数智化转型:视频SOP如何成生产“新基建”?
  • 如何负责一个系统的稳定性
  • 【开题答辩全过程】以 慧源慈善救助系统为例,包含答辩的问题和答案
  • 一文讲透|专科生必备的AI论文工具 —— 千笔·专业论文写作工具