我正在尝试提高 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/