【发布时间】:2019-06-27 04:35:03
【问题描述】:
它似乎足够聪明,只为 A 使用一个字节,但不够聪明,无法为 B 使用一个字节,即使只有 8*8=64 种可能性。有什么方法可以哄 Rust 解决这个问题,还是我必须手动实现更紧凑的布局?
#![allow(dead_code)]
enum A {
L,
UL,
U,
UR,
R,
DR,
D,
DL,
}
enum B {
C(A, A),
}
fn main() {
println!("{:?}", std::mem::size_of::<A>()); // prints 1
println!("{:?}", std::mem::size_of::<B>()); // prints 2
}
【问题讨论】:
-
这是因为 rust 的枚举是其最大变体的大小。在这种情况下,
A是u8的大小,因此需要 两个 个字节来适应B中的 两个As,如没有像这样的编译时微优化。无论如何,如果打包版本的使用速度比解压版本慢怎么办? -
一句话,实现的行为。
-
@OptimisticPeach:在某些平台/用例上肯定会更糟,但是现在内存延迟通常较小的数据结构通过减少缓存未命中来弥补任何解包时间。我将拥有相当大的这些对象的向量,我将半随机访问,因此缓存未命中是我的用例的一个问题。我可以选择一些我必须选择的东西,但这仍然可以节省我自己手动执行打包逻辑的工作。
-
Rust 可以在一些更有限的情况下进行枚举布局优化,例如见github.com/rust-lang/rust/pull/45225
标签: enums rust memory-layout