联系

  • 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)
}

putao
8 声望3 粉丝

推动世界向前发展,改善民生。