Appearance
我们在上一节中提到了三个单词:Copy、Move、Clone,不知道你们还记得吗,这一节,我们来讨论一下三者的区别,以及在一个变量赋值给另一个变量的时候,是 Copy 还是 Move,又或者是 Clone。
每一个行为我们都从四个方面介绍它:本质、特点、适用场景和最后的结果。
Copy
首先是 Copy,它是一个非常轻量级的操作,它可以直接对内存中的每一个比特位全量复制。
- 本质:浅拷贝(Shallow Copy),它只会复制栈(Stack)上的数据。
- 特点:特别快,开销小。
- 适用场景:简单值,例如整型、浮点、布尔等等。
- 结果:它会产生两份一模一样的数据,两者互不影响且都有效。
Move
Move 则代表所有权的转移,不产生数据副本,而是改变了数据的所属与谁。
- 本质:权限的改变,原变量不再拥有这块内存的所有权(访问、修改)。
- 特点:效率极高,因为 Move 不需要重新分配或改变堆上的数据。
- 适用场景:管理复杂、庞大的数据类型,例如字符串、Vec、文件句柄等等。
- 后果:数据不会发生改变或产生副本,新变量拥有所有权,旧变量不再拥有所有权
就像是房子的产权发生改变,房产证上的名字从 A 变成 B,A 不再拥有房子的居住、转让或其他权利,也就是 A 从拥有变到了不拥有,而 B 从不拥有变到了拥有。
Clone
Clone 和 Copy 是不一样的行为,Copy 是轻量级的操作,主要处理存在于栈上的数据;Clone 则是一个重操作,用于处理对上的数据。
- 本质:深拷贝(Deep Copy),对在堆上的数据产生副本。
- 特点:开销大(时间和内存),但实现足够安全。
- 适用场景:你需要两份独立的、互不干扰的复杂数据类型的数据,例如字符串、Vec等等。
- 后果:原变量和新变量各自拥有一片独立的内存。
总结
最后,我们列一个表格看看三者的对比:
| 特性 | Copy | Move | Clone |
|---|---|---|---|
| 内存操作 | 复制栈上的位 | 转移所有权 | 完整复制堆栈数据 |
| 性能 | 极快 | 极快(仅指针操作) | 较慢(涉及分配堆内存) |
| 原变量 | ✅ 有效 | ❌ 失效 | ✅ 有效 |
| 适用的数据类型 | 简单、固定大小 | 复杂、动态大小 | 任何实现了 Clone 的类型 |