正在寻找打包枚举,同时这样做,我运行了以下程序
enum SizeEnum {
V1(u32, u32),
// V2(u64),
V3(u32, u32),
}
fn main() {
println!("{:?}", std::mem::size_of::<SizeEnum>());
}
操场上联系
输出为12字节(96位)。我期望的是16字节(128位)。这就是当我取消注释V2
variant时发生的情况。
问题是:
- 那么为什么
u32, u32
变体比u64
使用更少的空间呢? - 为什么是12字节(96位)而不是64+8(72位)?我认为这是关于填充的事情,但希望得到详细的答案。
这两个问题都归结为对齐问题。
需要将u32
s对齐为4字节。u64
需要对齐到8字节
因此,对于u32
,有3个字节的填充用于区分符(因此u32
位于第四个字节),对于u64
,有7个字节。