Rust 所有权机制
一句话定位:Rust 用编译期的所有权 + 借用检查替代了 C++ 手工内存管理与 GC 语言的运行时开销,在没有运行时垃圾回收的前提下,静态地消除了数据竞争与悬垂指针这两类最常见的内存安全问题。
1. 所有权(Ownership)三条基本规则
- 每个值都有唯一的”所有者”(owner)变量。
- 同一时刻只能有一个所有者;赋值/传参默认是**移动(move)**而不是拷贝,原变量随即失效。
- 所有者离开作用域时,值被自动释放(析构),这一点与 C++ 的 RAII(6.1)思路一致,只是 Rust 把”移动语义默认化”并在编译期强制检查。
2. 借用(Borrowing):不转移所有权的引用
- 不可变借用
&T:可以同时存在多个,只能读。 - 可变借用
&mut T:同一时刻只能存在一个,且与任何不可变借用互斥。 - 编译器在编译期静态检查这套规则(借用检查器,borrow checker),一旦违反(比如同时存在可变借用和不可变借用)直接编译不通过,而不是留到运行时才崩溃或产生数据竞争。
3. 与 C++/GC 语言的对比(核心面试话术)
| 维度 | C++ | Rust | GC 语言(Java/Python) |
|---|---|---|---|
| 内存安全检查时机 | 无强制检查,靠开发者自律 + RAII 约定 | 编译期静态检查 | 运行期(GC 回收 + 部分运行时异常) |
| 数据竞争 | 可能发生,靠 mutex 手工避免 | 编译期消除(Send/Sync trait) |
可能发生,靠锁/并发工具手工避免 |
| 运行时开销 | 无额外开销 | 无额外开销(零成本抽象) | 有 GC 开销 |
核心话术:Rust 把 C++ 里”程序员自己保证不出错”的部分,变成了”编译器强制证明不会出错”,代价是学习曲线更陡、部分合法但难以证明安全的代码需要 unsafe 逃生舱。
4. 面试落点
- 能讲清”所有权/借用检查解决了什么问题”:悬垂指针(借用检查保证引用不会比数据活得更久)、数据竞争(可变/不可变借用互斥规则)。
- 若岗位倾向 Rust(如高性能数据处理算子),可以说明这套机制特别适合”高并发 + 高性能 + 不想为内存安全牺牲性能”的场景,是 C++ 之外的另一个选择。
参考:《The Rust Programming Language》(Rust 官方教程 “The Book”)