【问题标题】:Why does an enum require extra memory size?为什么枚举需要额外的内存大小?
【发布时间】:2015-02-04 03:36:35
【问题描述】:

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

【问题讨论】:

    标签: rust


    【解决方案1】:

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

    【讨论】:

    • 至于8字节的增加:这只是内存对齐的问题。大部分空间都没有使用。这只是填充。
    • 我很想看看 Rust 枚举的内存布局。有人知道这方面的文章吗?
    • @RajV,添加了 Rustonomicon 的链接
    【解决方案2】:

    作为第一个近似值,您可以假设枚举是其变体的最大值的大小加上一个判别值,以了解它是哪个变体,四舍五入以有效对齐。对齐方式取决于平台。

    这并不总是正确的;有些类型“聪明”并且包装更紧凑,例如Option&lt;&amp;T&gt;。你的E1 是另一个例子;它不需要判别式,因为只有一个可能的值。

    枚举的实际内存布局是未定义的,由编译器决定。如果你有一个没有值的变量的枚举,你可以使用repr 属性来指定总大小。

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

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2015-08-24
      相关资源
      最近更新 更多