面试题答案
一键面试- 内存占用分析
- Rust 中的
i32
类型通常占用 4 个字节(在大多数常见平台上)。 - 对于结构体
Point { x: i32, y: i32 }
,由于它包含两个i32
字段,所以它的实例在内存中占用 8 个字节(4 字节的x
加上 4 字节的y
)。 - Rust 中的复制语义意味着当创建结构体实例并进行复制操作时,会在栈上分配新的内存空间来存储复制后的实例。例如:
struct Point { x: i32, y: i32, } let p1 = Point { x: 1, y: 2 }; let p2 = p1;
- 这里
p1
会在栈上分配 8 个字节的空间来存储x
和y
的值。当执行let p2 = p1;
时,p2
也会在栈上分配另外 8 个字节的空间,并且p1
中的值会被逐字节复制到p2
的内存空间中。
- Rust 中的
- 内存分配机制
- 栈分配:在 Rust 中,对于实现了
Copy
trait 的类型(i32
以及由Copy
类型组成的结构体如Point
),实例的创建和复制都是在栈上进行的。栈的分配非常高效,因为它遵循后进先出(LIFO)的原则。当一个函数调用开始时,会在栈上为该函数的局部变量分配空间,包括结构体实例。例如上述代码中p1
和p2
的创建,它们的内存空间都是在栈上分配的。
- 栈分配:在 Rust 中,对于实现了
- 内存释放机制
- 栈上内存释放:当包含结构体实例的作用域结束时,栈上为该实例分配的内存会自动释放。例如,在上述代码所在函数结束时,栈上为
p1
和p2
分配的内存空间会随着函数栈帧的弹出而被释放。不需要手动管理内存释放,这是 Rust 内存安全机制的一部分,通过栈的自动管理来避免常见的内存错误,如悬空指针和内存泄漏。
- 栈上内存释放:当包含结构体实例的作用域结束时,栈上为该实例分配的内存会自动释放。例如,在上述代码所在函数结束时,栈上为