在Learning Rust With Entirely Too Many Linked Lists中,作者提到:
但是,如果我们有一种特殊的枚举:enum Foo {
一个,
B(ContainsANonNullPtr),
}
空指针优化启动,这消除了标签所需的空间 . 如果变量是A,则整个枚举设置为全0 . 否则,变量是B.这是有效的,因为B永远不能全为0,因为它包含非零指针 .
我想作者说的是(假设 A
是4位, B
是4位)
let test = Foo::A
内存布局是
0000 0000
但
let test = Foo::B
内存布局是
some 8 bit non 0 value
究竟在这里优化了什么?两种表示都不总是8位当作者声称时它是什么意思
这意味着&,&mut,Box,Rc,Arc,Vec和Rust中的其他几个重要类型在放入选项时没有开销
2 回答
空指针优化基本上意味着如果你有一个包含两个变量的枚举,其中一个变量没有关联数据,而另一个变量具有关联数据,其中所有零的位模式不是有效值,那么枚举本身将获取与相关值完全相同的空间量,使用全零位模式指示它是另一个变体 .
换句话说,这意味着
Option<&T>
与&T
的大小完全相同,而不需要额外的单词 .enum
是一个标记的联合 . 没有优化它看起来像空指针优化删除单独的标记字段 .