Rust中Clone是用于在堆上复制,而Copy是用于在堆栈上复制吗?

Fin*_*ber 3 rust

正如标题所说,我可以正确地说 Clone 用于在堆上复制,而 Copy 用于在 Rust 中的堆栈上复制吗?

这基本上就是这篇文章所说的内容但我对其正确性表示怀疑。

kmd*_*eko 7

复制与克隆并不等同于堆栈与堆。CopyClone是特征,是类型的属性,而不是值所在的属性。它们与所有权的联系比内存区域的联系更紧密。

考虑这个示例,其中整数存储在堆上(通过Vec),并且我从一个元素复制到另一个元素。这使用了Copy(因为没有显式的.clone()),但源和目标都在堆上:

let mut v = vec![0i32; 10];
v[0] = v[1];
Run Code Online (Sandbox Code Playgroud)

考虑这个例子,其中 aRefCell存储在堆栈上,并用于Clone获取另一个相同的。两个元素都在堆栈上,但我必须使用,.clone()因为RefCell没有实现Copy。ARefCell也不使用任何堆分配:

let rc1 = RefCell::new(...);
let rc2 = rc1.clone();
Run Code Online (Sandbox Code Playgroud)

类型实现Copy仅仅意味着它可以从一个内存位置按位复制到另一个内存位置,并且两个实例同等有效。

Copy对于比较来说重要的Clone是,当创建或销毁类型时,除了它所保存的就地数据之外,是否还需要应用其他含义。拥有堆分配内存的所有权就是其中一种情况,因为当所有者被销毁时,您需要取消分配该内存。保留额外的簿记记录也会RefCell使其无法实施Copy,因为数据的简单按位复制会产生不一致或无法使用的结果。open()管理文件句柄等外部资源是另一种情况,因为您必须与操作系统close()显式协调文件。