首页 文章

Rust中的空指针优化是什么?

提问于
浏览
6

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 回答

  • 5

    空指针优化基本上意味着如果你有一个包含两个变量的枚举,其中一个变量没有关联数据,而另一个变量具有关联数据,其中所有零的位模式不是有效值,那么枚举本身将获取与相关值完全相同的空间量,使用全零位模式指示它是另一个变体 .

    换句话说,这意味着 Option<&T>&T 的大小完全相同,而不需要额外的单词 .

  • 11

    enum 是一个标记的联合 . 没有优化它看起来像

    Foo::A;    // tag 0x00 data 0xXX
    Foo::B(2); // tag 0x01 data 0x02
    

    空指针优化删除单独的标记字段 .

    Foo::A;    // tag+data 0x00
    Foo::B(2); // tag+data 0x02
    

相关问题