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

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,有7个字节填充.

Rust相关问答推荐

as操作符如何将enum转换为int?

在actix—web中使用Redirect或NamedFile响应

PyReadonlyArray2到Vec T<>

trait声明中的生命周期参数

如何处理动态 struct 实例化?

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

有没有更好的方法从HashMap的条目初始化 struct ?

带扫描的铁 rust 使用滤镜

通过使用光标拖动角来绕其中心旋转矩形

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

如何修复数组中NewType导致的运行时开销

允许 rust 迹 struct 条目具有多种类型

类型生命周期绑定的目的是什么?

Rust 重写函数参数

为什么 Rust 的临时值有时有参考性有时没有?

std::vector::shrink_to_fit 如何在 Rust 中工作?

试图理解 Rust 中的可变闭包

有没有办法阻止 rust-analyzer 使非活动代码变暗?

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?