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

时间:2014-12-05 21:17:29

标签: rust

我的理解是enum与C中的union类似,系统将在枚举中分配最大的数据类型。

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按预期占用8个字节,但E2占用16个字节?

2 个答案:

答案 0 :(得分:11)

在Rust中,与C不同,enumtagged unions。也就是说,enum知道它拥有哪个值。所以8个字节是不够的,因为标签没有空间。

答案 1 :(得分:8)

作为第一个近似值,您可以假设枚举是其变体加上的最大值的大小,以便知道它是哪个变体,向上舍入以有效对齐。对齐取决于平台。

这不总是正确的;有些类型是&#34;聪明的&#34;然后收拾得更紧,比如Option<&T>。你的E1是另一个例子;它不需要判别因为只有一个可能的值。

枚举的实际内存布局是未定义的,并且是编译器的奇思妙想。如果您的枚举包含没有值的变体,则可以使用repr属性指定总大小。

您可以 在Rust中使用联合。这些具有标记/判别值,并且是最大变体的大小(也可能添加对齐)。作为交换,这些是不安全的阅读,因为你无法确定它是什么变体。

另见: