Copy浅拷贝适用于纯栈上、无堆资源的小型类型按位复制仅复制栈上字节性能开销极低标记trait无方法使用时赋值、传参自动触发实现Copy必须同时实现Clone不能与Drop共存优先使用 Copy 的场景类型仅由基本数值、布尔、字符等组成且大小固定如Point、Color。需要频繁传递但不想增加.clone()调用的心智负担。对性能敏感希望编译器自动优化为按位复制。Clone深拷贝适用于几乎所有类型复制堆数据涉及堆分配性能开销大普通trait有clone()方法使用时需要显式调用clone()方法独立 trait不要求Copy可与Drop共存必须使用 Clone 的场景类型包含String、VecT、BoxT等堆分配字段。需要一份完全独立的副本修改副本不影响原数据。类型实现了Drop有自定义清理逻辑。需要定制复制过程例如深拷贝图结构、增加引用计数。Copy的使用1、基本类型直接使用Copylet x 5; let y x; // 自动复制x 未被移动2、纯栈上结构体派生Copy// Copy 只能用于简单类型所有字段都是 Copy#[derive(Debug, Clone, Copy)]// 必须同时派生 Clone因为 Copy trait 的定义要求 Copy: ClonestructPoint{x:i32,y:i32,}letpt1Point{x:3,y:4};letpt2pt1;// Copy 自动发生不用 clone()println!({:?},pt1);// ✅ pt1 还能用因为是 CopyClone的使用1、标准库类型使用clone()克隆lets1String::from(hello);lets2s1.clone();2、结构体派生Clone#[derive(Debug, Clone)]structPerson{name:String,}fnmain(){letp1Person{name:张三.to_string(),};letp2p1.clone();// 显式克隆println!({:?},p1);// ✅ p1 还能用}3、手动实现Clone#[derive(Debug)]structCounter{id:i32,count:i32}implCloneforCounter{fnclone(self)-Self{Counter{id:self.id,count:0}// 克隆时重置计数器非复制原值}}fnmain(){letc1Counter{id:5,count:88};letc2c1.clone();println!({:?},c1);// Counter { id: 5, count: 88 }println!({:?},c2);// Counter { id: 5, count: 0 }}
rust语言学习笔记Trait(一)Copy、Clone(拷贝)
Copy浅拷贝适用于纯栈上、无堆资源的小型类型按位复制仅复制栈上字节性能开销极低标记trait无方法使用时赋值、传参自动触发实现Copy必须同时实现Clone不能与Drop共存优先使用 Copy 的场景类型仅由基本数值、布尔、字符等组成且大小固定如Point、Color。需要频繁传递但不想增加.clone()调用的心智负担。对性能敏感希望编译器自动优化为按位复制。Clone深拷贝适用于几乎所有类型复制堆数据涉及堆分配性能开销大普通trait有clone()方法使用时需要显式调用clone()方法独立 trait不要求Copy可与Drop共存必须使用 Clone 的场景类型包含String、VecT、BoxT等堆分配字段。需要一份完全独立的副本修改副本不影响原数据。类型实现了Drop有自定义清理逻辑。需要定制复制过程例如深拷贝图结构、增加引用计数。Copy的使用1、基本类型直接使用Copylet x 5; let y x; // 自动复制x 未被移动2、纯栈上结构体派生Copy// Copy 只能用于简单类型所有字段都是 Copy#[derive(Debug, Clone, Copy)]// 必须同时派生 Clone因为 Copy trait 的定义要求 Copy: ClonestructPoint{x:i32,y:i32,}letpt1Point{x:3,y:4};letpt2pt1;// Copy 自动发生不用 clone()println!({:?},pt1);// ✅ pt1 还能用因为是 CopyClone的使用1、标准库类型使用clone()克隆lets1String::from(hello);lets2s1.clone();2、结构体派生Clone#[derive(Debug, Clone)]structPerson{name:String,}fnmain(){letp1Person{name:张三.to_string(),};letp2p1.clone();// 显式克隆println!({:?},p1);// ✅ p1 还能用}3、手动实现Clone#[derive(Debug)]structCounter{id:i32,count:i32}implCloneforCounter{fnclone(self)-Self{Counter{id:self.id,count:0}// 克隆时重置计数器非复制原值}}fnmain(){letc1Counter{id:5,count:88};letc2c1.clone();println!({:?},c1);// Counter { id: 5, count: 88 }println!({:?},c2);// Counter { id: 5, count: 0 }}