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

Raj*_*ajV 7 rust

我的理解是,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个字节?

Dav*_*rtz 12

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

  • 我很想看到Rust枚举的内存布局.有人知道那篇文章吗? (10认同)
  • 至于8字节增加:这只是关于内存对齐.大部分空间都没有使用.它只是填充. (7认同)

She*_*ter 8

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

这并非总是如此; 有些类型是"聪明",包装有点紧,如Option<&T>.你E1是另一个例子; 它不需要判别式,因为只有一个可能的值.

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

您可以拉斯特使用工会.它们没有标记/判别值,并且是最大变体的大小(也可能是添加对齐).作为交换,这些是不安全的阅读,因为你不能静态地确定它是什么变体.

也可以看看:


归档时间:

查看次数:

2445 次

最近记录:

7 年,6 月 前