MST

星途 面试题库

面试题:Rust中clone方法在不同数据类型上的表现

在Rust中,有自定义结构体`struct Point { x: i32, y: i32 }`,为该结构体实现`Clone` trait,并说明调用`clone`方法时数据是如何复制的。同时,对比`Point`结构体和`Vec<i32>`在调用`clone`方法时数据复制机制的差异。
43.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

实现 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 方法时,由于 xy 都是 i32 类型,它们是简单的标量类型,在栈上分配。clone 方法会逐字段地复制这些值,也就是将 self.x 复制到新的 Point 实例的 x 字段,将 self.y 复制到新的 Point 实例的 y 字段。这是一种浅复制,因为 i32 类型本身不包含任何指向堆内存的指针。

PointVec<i32> 在调用 clone 方法时数据复制机制差异

  • Point:如上述所说,是逐字段的浅复制,所有数据都在栈上,复制的开销相对较小,因为只涉及栈上数据的复制。
  • Vec<i32>Vec<i32> 是一个动态数组,它在栈上存储一个指向堆内存的指针、长度和容量信息。当调用 Vec<i32>clone 方法时,会在堆上分配一块新的内存,其大小与原 Vec 相同,然后将原 Vec 在堆上存储的所有 i32 值逐个复制到新分配的堆内存中。这不仅涉及栈上指针、长度和容量信息的复制(浅复制部分),还涉及堆上数据的深复制,所以开销比 Pointclone 要大。