正如标题所说,我可以正确地说 Clone 用于在堆上复制,而 Copy 用于在 Rust 中的堆栈上复制吗?
这基本上就是这篇文章所说的内容,但我对其正确性表示怀疑。
复制与克隆并不等同于堆栈与堆。Copy和Clone是特征,是类型的属性,而不是值所在的属性。它们与所有权的联系比内存区域的联系更紧密。
考虑这个示例,其中整数存储在堆上(通过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()显式协调文件。
| 归档时间: |
|
| 查看次数: |
1319 次 |
| 最近记录: |