面试题答案
一键面试实现 Clone
trait
struct Point {
x: i32,
y: i32
}
impl Clone for Point {
fn clone(&self) -> Self {
Point {
x: self.x,
y: self.y
}
}
}
Point
调用 clone
时数据复制方式
当调用 Point
结构体的 clone
方法时,由于 x
和 y
都是 i32
类型,它们是简单的标量类型,在栈上分配。clone
方法会逐字段地复制这些值,也就是将 self.x
复制到新的 Point
实例的 x
字段,将 self.y
复制到新的 Point
实例的 y
字段。这是一种浅复制,因为 i32
类型本身不包含任何指向堆内存的指针。
Point
与 Vec<i32>
在调用 clone
方法时数据复制机制差异
Point
:如上述所说,是逐字段的浅复制,所有数据都在栈上,复制的开销相对较小,因为只涉及栈上数据的复制。Vec<i32>
:Vec<i32>
是一个动态数组,它在栈上存储一个指向堆内存的指针、长度和容量信息。当调用Vec<i32>
的clone
方法时,会在堆上分配一块新的内存,其大小与原Vec
相同,然后将原Vec
在堆上存储的所有i32
值逐个复制到新分配的堆内存中。这不仅涉及栈上指针、长度和容量信息的复制(浅复制部分),还涉及堆上数据的深复制,所以开销比Point
的clone
要大。