Rust 的 Option 类型的开销是多少?

在 Rust 中,引用永远不能为 null,因此在实际需要 null 的情况下,比如链表,可以使用 Option类型:

struct Element {
value: i32,
next: Option<Box<Element>>,
}

与一个简单的指针相比,在内存分配和解引用步骤方面有多大的开销?在编译器/运行时中是否存在某种“魔法”使得 Option成本低廉,或者比在使用相同的 enum结构的非核心库中自己实现 Option或者将指针包装在向量中的成本更低?

19506 次浏览

Yes, there is some compiler magic that optimises Option<ptr> to a single pointer (most of the time).

use std::mem::size_of;


macro_rules! show_size {
(header) => (
println!("{:<22} {:>4}    {}", "Type", "T", "Option<T>");
);
($t:ty) => (
println!("{:<22} {:4} {:4}", stringify!($t), size_of::<$t>(), size_of::<Option<$t>>())
)
}


fn main() {
show_size!(header);
show_size!(i32);
show_size!(&i32);
show_size!(Box<i32>);
show_size!(&[i32]);
show_size!(Vec<i32>);
show_size!(Result<(), Box<i32>>);
}

The following sizes are printed (on a 64-bit machine, so pointers are 8 bytes):

// As of Rust 1.22.1
Type                      T    Option<T>
i32                       4    8
&i32                      8    8
Box<i32>                  8    8
&[i32]                   16   16
Vec<i32>                 24   24
Result<(), Box<i32>>      8   16

Note that &i32, Box, &[i32], Vec<i32> all use the non-nullable pointer optimization inside an Option!