我的理解是,enum就像union在C中一样,系统将在枚举中分配最大的数据类型.
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>());
}
Run Code Online (Sandbox Code Playgroud)
为什么E1按预期占用8个字节,但E2占用16个字节?
作为第一个近似值,您可以假设枚举是其变体的最大值加上判别值,以便知道它是哪个变量,向上舍入以有效对齐.对齐取决于平台.
这并非总是如此; 有些类型是"聪明",包装有点紧,如Option<&T>.你E1是另一个例子; 它不需要判别式,因为只有一个可能的值.
枚举的实际内存布局是未定义的,并且是编译器的奇思妙想.如果您的枚举具有没有值的变体,则可以使用repr属性指定总大小,从而指定布局.
您可以也拉斯特使用工会.它们没有标记/判别值,并且是最大变体的大小(也可能是添加对齐).作为交换,这些是不安全的阅读,因为你不能静态地确定它是什么变体.
也可以看看:
| 归档时间: |
|
| 查看次数: |
2445 次 |
| 最近记录: |