MST

星途 面试题库

面试题:Rust 复制语义对复杂嵌套数据结构内存占用的影响

定义一个复杂的数据结构,如包含 `Vec<i32>` 和自定义结构体嵌套的 `enum`,例如 `enum ComplexData { Case1(Vec<i32>), Case2 { sub_struct: Point, sub_vec: Vec<u8> } }`,其中 `Point` 是之前定义的包含两个 `i32` 字段的结构体。当对 `ComplexData` 类型的值进行复制时,Rust 的复制语义是如何工作的?这种复制操作会导致怎样的内存占用变化?请从栈内存和堆内存的角度详细阐述。
41.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 定义相关数据结构
struct Point {
    x: i32,
    y: i32,
}

enum ComplexData {
    Case1(Vec<i32>),
    Case2 { sub_struct: Point, sub_vec: Vec<u8> },
}
  1. Rust的复制语义
    • 对于Case1(Vec<i32>)
      • Vec<i32> 类型实现了 Clone 而不是 Copy。当复制 ComplexData::Case1 时,会调用 Vec<i32>clone 方法。
      • 栈内存:栈上存储的是 Vec 结构体本身,包含一个指向堆内存的指针、长度和容量信息。复制时,栈上的 Vec 结构体被复制一份,这部分栈内存占用翻倍。
      • 堆内存Vec 所指向的堆内存中的 i32 数据会被重新分配内存并复制一份,堆内存占用也翻倍。
    • 对于Case2 { sub_struct: Point, sub_vec: Vec<u8> }
      • Point 结构体如果没有自定义实现,默认会实现 Copy 特性(因为其字段 xy 都是 Copy 类型)。Vec<u8> 实现 Clone
      • 栈内存Point 结构体在栈上直接复制一份,栈内存占用增加 Point 结构体的大小。Vec<u8> 的栈上部分(指针、长度、容量)被复制一份,栈内存占用进一步增加。
      • 堆内存Vec<u8> 所指向的堆内存中的 u8 数据会被重新分配内存并复制一份,堆内存占用翻倍。

总体来说,对 ComplexData 类型的值进行复制,栈内存和堆内存的占用都会相应增加,具体增加的量取决于数据结构的具体内容。