我可以限制 Rust 枚举的大小吗?

Eli*_*ita 2 enums discriminated-union rust

我的 Rust 程序中有一个枚举类型,其中一些变体可能包含内部数据。

enum MyEnum {
    A,
    B(u64),
    C(SmallStruct),
    D(Box<LargeStruct>)
}
Run Code Online (Sandbox Code Playgroud)

这个枚举将被存储数万次,内存使用是一个问题。我想避免意外地为枚举添加一个非常大的变体。有没有办法告诉编译器限制内存中枚举实例的大小?

use*_*342 7

正如其他答案提到的,你可以使用const_assert!宏,但它会需要一个外部箱,static_assertions。如果您正在寻找仅限 std 的解决方案,并且在断言失败时可以忍受更丑陋的错误消息,您可以使用这个 ( playground ):

#[deny(const_err)]
const fn const_assert(ok: bool) {
    0 - !ok as usize;
}

// assert that MyEnum is no larger than 16 bytes
const _ASSERT_SMALL: () = const_assert(mem::size_of::<MyEnum>() <= 16);
Run Code Online (Sandbox Code Playgroud)

您可以在crate的作者撰写的文章中阅读有关此技术以及改进它的方法static_assertions。