Rust为什么(u32, u32)的枚举变量的大小小于(u64)?



正在寻找打包枚举,同时这样做,我运行了以下程序

enum SizeEnum {
V1(u32, u32),
// V2(u64),
V3(u32, u32),
}
fn main() {
println!("{:?}", std::mem::size_of::<SizeEnum>());
}

操场上联系

输出为12字节(96位)。我期望的是16字节(128位)。这就是当我取消注释V2variant时发生的情况。

问题是:

  1. 那么为什么u32, u32变体比u64使用更少的空间呢?
  2. 为什么是12字节(96位)而不是64+8(72位)?我认为这是关于填充的事情,但希望得到详细的答案。

这两个问题都归结为对齐问题。

需要将u32s对齐为4字节。u64需要对齐到8字节

因此,对于u32,有3个字节的填充用于区分符(因此u32位于第四个字节),对于u64,有7个字节。

最新更新