Copy trait和Clone trait

Copy trait表示可以通过memcpy安全地复制的值, 想 赋值和 通过值来传递参数 这些操作总是通过memcpy来进行。
如果,实现了Copy trait的值,如果进行赋值 和 通过值传参, 不会 移动 所有权。

let x: u8 = 123;
let y = x;
// x 复制了一份到y,  x 没有移动,还可以用
println!("x={}, y={}", x, y);

// Vec<u8>  实现 Clone, 但没有实现Copy
let v: Vec<u8>  = vec![1, 2, 3];

let w = v;  // 所以,赋值操作, 会"移动" 值到 w,  现在v已经没了

let w = v.clone();

每一个实现了Copy trait的类型,都会要求实现Clone.
然而,它们的要求是不一样的。
对于你自己定义的类型, .clone()函数的实现,可以用你选择的任意方法,但是
隐式的copy(比如赋值操作),总是会触发一个memcpy, 而不是调用clone(&self)的实现

Copy是隐式的,不能被重新实现(用的是memcpy)
Clone是显式调用,可能实现的代价很昂贵,可以用任意的方式来实现
通常有Copy trait的类型,都是简单的基本类型。

只有完全存在于stack中的类型(所有的内容都在stack上,而不是有一部分内容放在heap, 而其引用放在stack),才能实现Copy.
实现Copy意味着 该类型的值,能够 按照它的stack 上的表示,进行按位复制。
赋值操作,不会让之前的所有者失效,而是会创建一个克隆。
String类型将其内容存储在Heap上,所以她不是Copy

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注