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