是的,有一些編譯器魔術可以優化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