在Rust中,引用永远不能为null,因此在实际需要null(例如链表)的情况下,请使用以下Option
类型:
struct Element {
value: i32,
next: Option<Box<Element>>,
}
与简单指针相比,就内存分配和取消引用的步骤而言,这涉及多少开销?在编译器/运行时中,是否有一些“魔术”可以使Option
成本降低,或者比Option
使用非核心库使用相同的enum
构造自己实现或通过将指针包装在向量中实现成本更低?
Answers:
是的,在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
!
Result<i32, i32>
您将看到再次应用了优化。
Option
-like”枚举中,因此它也适用于用户定义的Option
。