Rust的Option类型的开销是多少? [英] What is the overhead of Rust's Option type?
问题描述
在Rust中,引用永远不能为null,因此在实际需要null(例如链表)的情况下,请使用Option
类型:
In Rust, references can never be null, so in case where you actually need null, such as a linked list, you use the Option
type:
struct Element {
value: i32,
next: Option<Box<Element>>,
}
与简单的指针相比,在内存分配和取消引用步骤方面涉及多少开销?在编译器/运行时中,是否有一些魔术"可以使Option
成为免费的,或者比使用非核心库使用相同的enum
构造自己实现Option
的成本更低,或者比通过以下方式实现的成本更低?将指针包装在矢量中?
How much overhead is involved in this in terms of memory allocation and steps to dereference compared to a simple pointer? Is there some "magic" in the compiler/runtime to make Option
cost-free, or less costly than if one were to implement Option
by oneself in a non-core library using the same enum
construct, or by wrapping the pointer in a vector?
推荐答案
是的,有一些编译器魔术可以将Option<ptr>
优化为单个指针(大部分时间).
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>>);
}
将打印以下大小(在64位计算机上,因此指针为8字节):
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
请注意,&i32
,Box
,&[i32]
,Vec<i32>
都在Option
内使用非空指针优化!
Note that &i32
, Box
, &[i32]
, Vec<i32>
all use the non-nullable pointer optimization inside an Option
!
这篇关于Rust的Option类型的开销是多少?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!