联系
- Copy 是 Clone 的子集,一个类型实现了 Copy 特性时,编译器会自动提供相应的 Clone 实现。
- Clone 则提供了一种灵活但更高成本的深拷贝方式
- Copy 提供了一种低成本的复制方式
Clone 特性
Clone是一种明确且通用的深拷贝操作。实现Clone的类型可以通过调用clone方法创建该类型的深拷贝。深拷贝意味着会复制整个结构体或其它复杂数据类型的所有内容,而不仅仅是浅拷贝。
- 需要显式调用:你需要显式调用clone方法来创建副本。
- 适用于复杂类型:适用于任何需要深拷贝的类型,包括Vec、HashMap等。
- 可能有成本:深拷贝会增加运行时成本,因为它复制了所有数据。
#[derive(Clone)]
struct MyStruct {
data: Vec<i32>,
}
fn main() {
let a = MyStruct {
data: vec![1, 2, 3],
};
let b = a.clone(); // 通过clone方法显式地拷贝a到b
println!("{:?}", a.data); // 输出: [1, 2, 3]
println!("{:?}", b.data); // 输出: [1, 2, 3]
}
Copy 特性
Copy是一种更轻量级的拷贝操作,适用于那些位于栈上的、大小固定且简单的数据类型。实现了Copy特性的类型在赋值和传递时会自动地进行按位复制。Rust中的标量类型(如i32、f64等)默认实现了Copy特性。
- 自动拷贝:实现了Copy的类型在赋值或参数传递时自动进行拷贝,而无须显式调用。
- 受限于数据类型:只能用于那些可以安全进行按位拷贝的类型,通过编译器检查。
- 性能友好:按位拷贝通常效率更高,不涉及复杂的数据结构。
#[derive(Copy, Clone)]
struct MyStruct {
x: i32,
y: i32,
}
fn main() {
let a = MyStruct { x: 1, y: 2 };
let b = a; // 自动进行复制,因为MyStruct实现了Copy
println!("a: ({}, {}), b: ({}, {})", a.x, a.y, b.x, b.y); // 输出: a: (1, 2), b: (1, 2)
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。