当只需要一个字节时,为什么 Rust 使用两个字节来表示这个枚举?

2023-11-22

它似乎足够聪明,只为 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 中的类型不是理想的值集:它具有数据布局,描述了值的存储方式。管理该语言的“规则”之一是将类型放入struct or enum不会更改其数据布局:它在另一种类型中具有与独立时相同的布局,这允许您引用结构成员并与任何其他引用互换使用它们。*

没有办法同时容纳两个人As 变成一个字节,同时满足这个约束,因为 的大小A是一个完整的字节——你不能寻址字节的一部分,即使使用repr(packed)。未使用的位只是保持未使用状态(除非可以通过利基填充将它们重新用于存储枚举标记)。

*Well, repr(packed)实际上可以使这变得不真实。引用打包字段可能会导致未定义的行为,即使是安全代码!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当只需要一个字节时,为什么 Rust 使用两个字节来表示这个枚举? 的相关文章

随机推荐