Rust 为什么选项的大小<;f64>;64位Linux上的16字节?

Rust 为什么选项的大小<;f64>;64位Linux上的16字节?,rust,Rust,我在64位Linux上尝试了这个,它给出了16: println!("Results: {}", mem::size_of::<Option<f64>>()) println!((“结果:{}”,mem::size_of::()) 据我所知,这是因为: pub struct Discriminant<T>(u64, PhantomData<fn() -> T>); pub结构判别式(u64,PhantomData>); 64位鉴别器的

我在64位Linux上尝试了这个,它给出了
16

println!("Results: {}", mem::size_of::<Option<f64>>())
println!((“结果:{}”,mem::size_of::())
据我所知,这是因为:

pub struct Discriminant<T>(u64, PhantomData<fn() -> T>);
pub结构判别式(u64,PhantomData>);
64位鉴别器的意义是什么?对于手工编写的代码,256就足够了,对于生成的代码2^16将是一个巨大的数字,我甚至无法想象为什么需要2^32。为什么它会使用64位呢


为什么编译器不针对
选项
案例对其进行优化?结构末尾的8位应该足够了。

f64
具有64位对齐。因此,包含
f64
的类型需要至少64位的对齐。类型的大小保证是其对齐的倍数。因为它不能容纳64位,它需要上升到下一个倍数,128位/16字节。

为什么编译器不针对
选项
案例对它进行优化?它确实对它进行了优化。你只是还不明白这是在优化速度,而不是内存空间。另请参阅,其中的注释解决了你的问题。请注意,
Discriminant
的定义使用了
u64
,不是因为所有的鉴别器都是
u64
,而是因为它需要
u64
来存储可能的最大鉴别器值。在
选项
中,鉴别器的大小只有1(即
u8
的大小)。而在
选项
选项
中,鉴别器嵌入到内部类型中,根本不占用任何空间。类型的大小保证是其对齐的倍数-我不相信这是严格正确的;您可以选择不同的结构打包方法,有效的方法取决于体系结构。我不确定枚举是否有用于控制打包的选项。@Shepmaster“更具体地说,这是包含对齐填充的项类型的数组中连续元素之间的字节偏移量”意味着它是一个倍数,因为否则数组中的第二个结构将不对齐。
std::mem::align_of
!=<代码>标准::内存::大小_of。结构或堆栈中的单个值可能会在对齐填充中包含一些附加字段。@8472但std::mem::size_of::()%std::mem::align_of:():()==0,适用于所有类型,对吗?啊,对,我想的是,但这还不是RFC。