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

3
我在Rust程序中有一个枚举类型,其中某些变体可能包含内部数据。
enum MyEnum {
    A,
    B(u64),
    C(SmallStruct),
    D(Box<LargeStruct>)
}

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


2
运行 clippy,它会告诉你。 - Stargateur
2个回答

12
从 Rust 1.57 开始,您可以在 const 上下文中使用断言,因此这种检查将起作用:
// assert that MyEnum is no larger than 16 bytes
const _ASSERT_SMALL: () = assert!(mem::size_of::<MyEnum>() <= 16);

游戏场

原始答案如下,仅供参考。


正如其他答案中所提到的,您可以使用const_assert!宏,但是它需要一个外部crate,static_assertions。如果您正在寻找仅限std的解决方案,并且可以接受断言失败时更丑陋的错误消息,则可以使用以下内容:

#[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);

游乐场

您可以阅读由static_assertions箱作者撰写的文章,了解此技术以及改进方法。

编辑:原始文章链接无法使用,请参考Web存档版本


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接