memory - 如何在 Rust 的枚举中找到最大的变体?

标签 memory enums rust

我正在尝试提高 Rust 程序的性能,这需要我减少一些大型 enum 的大小。例如

enum EE {
    A, // 0
    B(i32), //4
    C(i64), // 8
    D(String), // 24
    E { // 16
        x: i64,
        y: i32,
    },
}

fn main() {
    println!("{}", std::mem::size_of::<EE>()); // 32
}

打印 32。但是如果我想知道 EE::A 的大小,我会得到一个编译错误

error[E0573]: expected type, found variant `EE::A`
  --> src/main.rs:14:40
   |
14 |     println!("{}", std::mem::size_of::<EE::A>());
   |                                        ^^^^^
   |                                        |
   |                                        not a type
   |                                        help: try using the variant's enum: `crate::EE`

error: aborting due to previous error

error: could not compile `play_rust`.

有没有办法找出哪个变体占用的空间最多?

最佳答案

不,没有办法获得 enum 的一个变体的大小。您能做的最好的事情就是获取变体包含的内容的大小,就好像它是一个独立的结构一样:

    println!("sizeof EE::A: {}", std::mem::size_of::<()>());         // 0
    println!("sizeof EE::B: {}", std::mem::size_of::<i32>());        // 4
    println!("sizeof EE::C: {}", std::mem::size_of::<i64>());        // 8
    println!("sizeof EE::D: {}", std::mem::size_of::<String>());     // 24
    println!("sizeof EE::E: {}", std::mem::size_of::<(i64, i32)>()); // 16

即使这也不是特别有用,因为它包含可用于存储标签的填充字节;正如您所指出的,如果 D 缩小为单个指针,则 enum 的大小可以减少到 16,但是您无法仅通过查看尺寸。如果将 y 定义为 i64,则每个变体的大小将相同,但 enum 的大小需要为 24 . 对齐是另一个混​​杂因素,它使 enum 的大小比“最大变体的大小加上标签”更复杂。

当然,这都是高度依赖于平台的,你的代码不应该依赖于任何具有特定布局的 enum(除非你可以用 #[repr] 注释)。

如果您担心某个特定的 enum,那么获取每个包含的类型的大小并不难。 Clippy 还为 enum 提供了 lint,变量之间的大小差异很大。但是,我不建议单独使用 size 来手动优化 enum 布局,或者装箱大小只有几个指针的东西——间接抑制编译器可能能够进行的其他类型的优化做。如果您优先考虑最少的空间使用量,您可能会意外地使您的代码在此过程中变慢很多。

关于memory - 如何在 Rust 的枚举中找到最大的变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58856828/

相关文章:

在linux上读写物理地址内存的自定义代码

java 。内存不足

java - Play 框架 scala 查询绑定(bind) java 类

java - 是否可以使用Java枚举将字母转换为数字?

class - 在字典中引用嵌套枚举?

rust - 您如何正确实现 View 矩阵?

c - 首先返回比free char值c

c++ - Rust 中有类似表达式模板的东西吗?

rust - 如果累加器既不是复制类型也不是可变的,是否可以在 Rust 中使用 fold

c - 使用 malloc 为数组分配内存