UnsafeCell如何告知rustc跳过别名优化?能否自定义实现?
UnsafeCell 与 Rust 别名优化的常见疑问解答
能不能自行实现 UnsafeCell 来跳过 &T 的别名优化?
不行。UnsafeCell
如果你自己定义一个结构上类似的类型,比如:
struct MyUnsafeCell<T> { inner: T, }
哪怕它的字段布局和标准库的 UnsafeCell 完全一致,rustc 也不会将其视为特殊类型。当你持有 &MyUnsafeCell<T> 时,编译器依然会默认内部的 T 是不可变的,会执行针对 &T 的别名优化,此时若通过 unsafe 代码修改内部值,会直接触发未定义行为。
UnsafeCell 是如何让编译器跳过别名优化的?
既不是通过属性标记,也不是靠 Rust 语法特性,完全是编译器通过硬编码规则识别的。
在 Rust 的内存模型中,只有 UnsafeCell&UnsafeCell<T>)的同时被修改。编译器在进行别名分析和优化时,会专门检查类型是否包含 UnsafeCell:如果是,就会放宽对该类型内部数据的不可变假设,不会执行基于 "共享引用不可变" 的别名优化。
UnsafeCell
取消了 &T 的不可变保证:共享引用 &UnsafeCell 可能指向正在被修改的数据。这被称为“内部可变性”。
这段文档描述的正是 UnsafeCell 的特殊地位——它是唯一被编译器认可的、打破共享引用不可变规则的合法方式。
内容的提问来源于stack exchange,提问作者Self
相关产品推荐
相关产品推荐

