【发布时间】:2019-11-14 12:30:01
【问题描述】:
我正在尝试提高 rust 程序的性能,这需要我减小一些较大的 enums 的大小。例如
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`.
有没有办法找出哪个变体占用的空间最多?
【问题讨论】:
-
“有没有一种有效的方法来获取每个枚举变量的大小?” → 所有变体都有相同的大小,对应枚举的大小。
-
@mcarton "所有变体都具有相同的大小",这取决于消耗最多内存的变体的大小,如果我能快速找到该变体,我可以快速改进我的枚举定义。我想请问如何快速找到那个变种,不好意思我表达不好。
-
@mcarton 在上面的例子中,
D(String)需要最多的内存大小,即 24,所以枚举的大小是 (24 + 8) = 32。如果我用 @ 替换D(String)987654328@,枚举的大小可以减少到16。如果rust可以告诉我D(String)使用24字节,这是所有变体中最大的一个,所以枚举大小应该是32字节,如果D(String)的大小可以减小,枚举的大小也可以减小。 -
@mcarton 虽然您在技术上是正确的,但我认为您正在分裂头发,并且很清楚 OP 的意图。甚至还有一个 Clippy lint 用于“枚举变量之间的大尺寸差异”,因为有一个枚举大小和每个变量的空间利用率的概念。
-
切线地,在类似示例的情况下,您也可以使用
Box<str>,它与Box<String>基本相同,但只占用 16 个字节,因此整个枚举可以容纳 24 个字节,同时避免双重间接成本。很少有充分的理由使用Box<String>。