是的,有一些编译器魔术可以优化Option<ptr>
到单个指针(大部分时间)。
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>>);
}
以下尺寸被打印(64位机器上,所以指针是8个字节):
// 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
注意&i32
,Box
,&[i32]
,Vec<i32>
全部使用非可空指针在Option
内优化!
此外,这种优化发生在所有类似“Option”的枚举中,所以它也适用于用户定义的Option。 – 2013-05-13 20:04:26