Rust 为什么枚举需要额外的内存大小?

Rust 为什么枚举需要额外的内存大小?,rust,Rust,我的理解是enum类似于C中的union,系统将分配enum中最大的数据类型 enum E1 { DblVal1(f64), } enum E2 { DblVal1(f64), DblVal2(f64), DblVal3(f64), DblVal4(f64), } fn main() { println!("Size is {}", std::mem::size_of::<E1>()); println!("Size is

我的理解是
enum
类似于C中的
union
,系统将分配enum中最大的数据类型

enum E1 {
    DblVal1(f64),
}

enum E2 {
    DblVal1(f64),
    DblVal2(f64),
    DblVal3(f64),
    DblVal4(f64),
}

fn main() {
    println!("Size is {}", std::mem::size_of::<E1>());
    println!("Size is {}", std::mem::size_of::<E2>());
}
枚举E1{ DblVal1(f64), } 枚举E2{ DblVal1(f64), DblVal2(f64), DblVal3(f64), DblVal4(f64), } fn main(){ println!(“大小为{}”,std::mem::Size_of::()); println!(“大小为{}”,std::mem::Size_of::()); }
为什么
E1
会像预期的那样占用8个字节,而
E2
会占用16个字节?

在Rust中,与C中不同,
enum
s是。也就是说,
enum
知道它持有哪个值。因此,8个字节是不够的,因为没有空间放置标记。

作为第一个近似值,您可以假设枚举是其变量的最大值加上一个判别值,以知道它是哪个变量,四舍五入以有效对齐。校准取决于平台

这并不总是正确的;有些类型是“聪明”的,而且包装有点紧,比如
Option
。你的
E1
就是另一个例子;它不需要判别式,因为只有一个可能的值

枚举的实际内存布局是未定义的,由编译器决定。如果枚举中的变量没有值,则可以使用
repr
属性指定总大小

你也可以在生锈的地方使用活接头。它们不具有标记/判别值,并且是最大变量的大小(可能还添加了对齐)。作为交换,阅读这些是不安全的,因为您无法静态地确定它是什么变体

另见:


至于8字节的增加:这只是关于内存对齐。此空间的大部分未被使用。这只是填充。我很想看看生锈枚举的内存布局。有人知道这方面的文章吗?@RajV添加了一个到Rustonomicon的链接