0%

Rust 所有权机制

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”)