Rust 的 Option 类型的开销是多少?
Posted
技术标签:
【中文标题】Rust 的 Option 类型的开销是多少?【英文标题】:What is the overhead of Rust's Option type? 【发布时间】:2013-05-06 11:01:27 【问题描述】:在 Rust 中,引用永远不能为 null,因此如果您确实需要 null,例如链表,则使用 Option
类型:
struct Element
value: i32,
next: Option<Box<Element>>,
与简单的指针相比,在内存分配和取消引用的步骤方面涉及多少开销?编译器/运行时是否有一些“魔法”可以使Option
免费,或者比使用相同enum
构造在非核心库中自己实现Option
的成本更低,或者通过将指针包装在向量中?
【问题讨论】:
【参考方案1】:是的,有一些编译器魔法可以将 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
-like”枚举中,因此它也适用于用户定义的Option
。
还要注意这个优化不能叠加。这可以在示例的最后一行中看到。当您将 Ok 的类型指定为 () 时,该特定结果类型将成为“类似枚举的选项”,因此无法在选项级别进行优化。但如果您尝试使用Result<i32, i32>
,您会看到再次应用了优化。
@Pajn 看起来,至少截至 2020 年 3 月,this type of optimization can be stacked 只要有足够多的其他无效二进制表示。当然,不可为空的指针通常只有一种无效的二进制表示。以上是关于Rust 的 Option 类型的开销是多少?的主要内容,如果未能解决你的问题,请参考以下文章
python numpy tolist() 增加了多少开销?
Option类型:C++(std::optional)Rust(Option)Go(gob.OptionalValue)