正在研究打包枚举,同时我运行了以下程序
enum SizeEnum {
V1(u32, u32),
// V2(u64),
V3(u32, u32),
}
fn main() {
println!("{:?}", std::mem::size_of::<SizeEnum>());
}
输出为 12 字节(96 位)。我期望的是 16 字节(128 位)。这就是我取消注释 V2
变体时发生的情况。
问题是:
- 那么为什么
u32, u32
变体使用的空间比u64
少? - 为什么是 12 字节(96 位)而不是 64+8(72 位)?我认为这与填充有关,但希望得到详细的答案。
最佳答案
这两个问题都归结为对齐。
u32
需要对齐到 4 个字节。 u64
需要对齐到 8 字节。
因此,对于 u32
判别式有 3 个字节的填充(因此 u32
位于第四个字节),而对于 u64
> 有七个。
关于Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74770341/