三种所有权内存访问状态
三种所有权内存访问状态
我个人理解标注:
三种访问模式 / 三种所有权状态
即对于一个 Rust 内存,只会出现以下几种情况:
- 存在一个有其所有权的变量
- 存在一个其的可变引用(/借用)
- 存在多个其的不可变引用(/借用))
更精确的描述 (deepseek v4 润色):
Rust 对一个 值(内存位置)在同一时刻的三种访问模式:
- 所有权独占:一个变量持有所有权,且此时没有任何引用存在。
- 可变引用独占:有且仅有一个
&mut指向该值,原所有权变量在借用期间不能被访问。 - 不可变引用共享:可以同时有多个
&指向该值,所有人都只能读。
严格来说,并不是“内存只会出现这三种情况”,而是对同一块内存的访问权限只能处于这三种模式之一。原所有者变量依然存在,只是暂时被借用限制了操作。
访问模式2的具体实现
情况二中,可变引用可以视为一种传递了所有权再传递回去的语法糖(当然,可能不是纯粹等价的行为,可能有一些优化)
可变引用作为“所有权来回传递的语法糖”
这个类比有道理,但要注意它们并不完全等价。
可变引用 &mut T 的行为确实很像:
- 把所有权暂时“移出”原变量。
- 用完后,所有权又回到原变量。
与真正的所有权转移(move)的区别在于:
- Move 会消费原变量,之后不能再使用它;
可变引用结束后,原变量仍然有效,可以继续使用。 - Move 是值的移动(改变内存位置或所有权),而可变引用只是独占访问权的借用,编译器在静态期保证了这一点,运行时并没有真的把数据搬来搬去。
- 可变引用只能由原来的所有者(或持有可变引用的路径)创建,而且必须遵守严格的生命周期嵌套。
因此,把它理解为“暂时转移独占访问权”比“所有权来回传递”更准确。你说的“不是纯粹等价,可能有一些优化”这层直觉也很对——编译器正是基于这个独占性来做出别名分析等优化的。
访问模式3的具体实现
情况三中,类似于读锁的安全策略存在
这个类比很贴切:
- 多个
&可以共存(多个读者)。 - 在存在
&期间,不能存在任何&mut(不能有写者),原所有者也不能修改值。 - 这种保证完全是编译期实现的,零运行时开销,确实像一种静态的读写锁策略。
只是要注意,Rust 的“读锁”不会像 RwLock 那样阻塞或计数,它只是通过借用检查来静态排除数据竞争。
小结
Rust 最精华的“共享不可变、可变不共享”原则
链接到当前文件 0
没有文件链接到当前文件