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

标签 rust enums bit

正在研究打包枚举,同时我运行了以下程序

enum SizeEnum {
    V1(u32, u32),
    // V2(u64),
    V3(u32, u32),
}

fn main() {
    println!("{:?}", std::mem::size_of::<SizeEnum>());
}

Playground link

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

问题是:

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

最佳答案

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

u32 需要对齐到 4 个字节。 u64 需要对齐到 8 字节。

因此,对于 u32 判别式有 3 个字节的填充(因此 u32 位于第四个字节),而对于 u64 > 有七个。

关于Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74770341/

相关文章:

rust - 试图从循环外部借用变量绑定(bind)

swift - 我可以将枚举定义为另一个枚举案例的子集吗?

java - 负数会消耗更多内存吗?

c - C 中的位掩码 - 如何获取字节的第一位?

ssl - 为什么 reqwest 需要安装 OpenSSL?

rust - Cell 或 RefCell 是最佳选择的情况

rust - 如何在不破坏 Rust 的情况下将枚举与参数匹配?

Java:Spring RestControllerAdvice 异常处理程序中未触发自定义枚举 validator 注释

Java 二十一点 OOP

不使用 << 或 >> 检查 32 位符号位