Skip to content

Copy vs Move vs Clone

🕒最后更新于: 2026年2月27日 03:01

我们在上一节中提到了三个单词: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等等。
  • 后果:原变量和新变量各自拥有一片独立的内存。

总结

最后,我们列一个表格看看三者的对比:

特性CopyMoveClone
内存操作复制栈上的位转移所有权完整复制堆栈数据
性能极快极快(仅指针操作)较慢(涉及分配堆内存)
原变量✅ 有效❌ 失效✅ 有效
适用的数据类型简单、固定大小复杂、动态大小任何实现了 Clone 的类型