我的理解是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个字节?
答案 0 :(得分:11)
在Rust中,与C不同,enum
是tagged unions。也就是说,enum
知道它拥有哪个值。所以8个字节是不够的,因为标签没有空间。
答案 1 :(得分:8)
作为第一个近似值,您可以假设枚举是其变体加上的最大值的大小,以便知道它是哪个变体,向上舍入以有效对齐。对齐取决于平台。
这不总是正确的;有些类型是&#34;聪明的&#34;然后收拾得更紧,比如Option<&T>
。你的E1
是另一个例子;它不需要判别因为只有一个可能的值。
枚举的实际内存布局是未定义的,并且是编译器的奇思妙想。如果您的枚举包含没有值的变体,则可以使用repr
属性指定总大小。
您可以 在Rust中使用联合。这些不具有标记/判别值,并且是最大变体的大小(也可能添加对齐)。作为交换,这些是不安全的阅读,因为你无法确定它是什么变体。
另见: