面试题答案
一键面试- 定义相关数据结构
struct Point {
x: i32,
y: i32,
}
enum ComplexData {
Case1(Vec<i32>),
Case2 { sub_struct: Point, sub_vec: Vec<u8> },
}
- 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
特性(因为其字段x
和y
都是Copy
类型)。Vec<u8>
实现Clone
。- 栈内存:
Point
结构体在栈上直接复制一份,栈内存占用增加Point
结构体的大小。Vec<u8>
的栈上部分(指针、长度、容量)被复制一份,栈内存占用进一步增加。 - 堆内存:
Vec<u8>
所指向的堆内存中的u8
数据会被重新分配内存并复制一份,堆内存占用翻倍。
- 对于
总体来说,对 ComplexData
类型的值进行复制,栈内存和堆内存的占用都会相应增加,具体增加的量取决于数据结构的具体内容。