在使用过多链表的 Rust 学习指南中,作者提到:
然而,如果我们有一种特殊类型的枚举:
如果空指针优化启动,将会省去标签所需的空间。如果变量是
enum Foo { A, B(ContainsANonNullPtr), }
A
,则整个枚举将被设置为所有0
。否则,该变量将是B
。这起作用的原因是B
永远不可能是全0
,因为它包含一个非零指针。
let test = Foo::A
内存布局是
0000 0000
但是
let test = Foo::B
内存布局是
some 8 bit non 0 value
这里优化了什么?这两种表示方式不都是8位吗?当作者声称什么时,这是什么意思?
这意味着在 Rust 中,
&
、&mut
、Box
、Rc
、Arc
、Vec
和其他几个重要类型在放入Option
时没有额外开销。
&
引用永远不可能为空。它还知道String
和Vec
永远不可能是全零;深入实现后,String
由Vec
支持,Vec
由RawVec
支持,RawVec
由Unique
支持,其中包含一个*const T
,但具有编译器属性声明其不能为null。类似地,标准库中有一个NonNull<T>
类型,作为一个*mut T
,永远不可能为空指针。 - Lily Ballard