Rust 中的 Copy、Move、Clone
Rust Copy Move Clone
Move
move就是移动,将一个变量赋值给另一个变量时(实际上是将原变量栈上的数据copy到新变量的栈上,浅拷贝),原变量的所有权也移动到新变量,访问旧变量就会发生错误,实现 Move Trait 的类型一般都是不定长类型,不定长类型就是编译期间不知道长度,无法在栈上分配空间,需要在堆上分配空间并可以动态扩容,比如 String内部实际上一个指向堆的 data 指针、一个标识 data 长度的 length和一个标识当前最大容量的 capacity,Vec 内部是一个指向堆的 data 指针、一个标识已使用的 length和一个标识当前最大容量的 capacity,以及切片(str, [u8],当然切片无法直接使用),以及 &mut self 也实现了 Move Trait
Copy
copy代表变量是可以拷贝的,拷贝意味着新变量与旧变量互补干扰,旧变量也可以访问,实现 Copy Trait 的类型一般是只在栈上分配内存的类型,比如所有的基本类型:整数、浮点数、布尔、基本类型数组([u8;10],数组是一组长度不变的同一类型的集合)以及所有成员都实现Copy Trait的自定义类型等,一般实现的Drop Trait的类型都是不是Copy, 切片引用不知道算不算,比如&str、&[u8],但要是这么说的话那所有的不可变引用其实都是Copy…
Clone
当Move的类型想进行深拷贝时,就需要实现Clone Trait了,它会将开辟一段新的堆内存,并将原来的堆数据拷贝到新堆上。当然,并不是所有类型都是这个逻辑,也有些类型是做了其他的操作,比如 Rc\Arc发生 clone()时只是把引用计数器+1;当然实现 Copy Trait 的类型也可以实现 Clone,但是基本上就是 return Self。