我可以限制 Rust 枚举的大小吗?
Can I limit the size of a Rust enum?
我的 Rust 程序中有一个枚举类型,其中一些变体可能包含内部数据。
enum MyEnum {
A,
B(u64),
C(SmallStruct),
D(Box<LargeStruct>)
}
这个枚举将被存储数万次,内存使用是一个问题。我想避免不小心为枚举添加一个非常大的变体。有没有一种方法可以告诉编译器限制内存中枚举实例的大小?
您可以使用 const_assert!
and mem::size_of
断言您的枚举小于或等于特定大小。
如其他答案所述,您可以使用 const_assert!
宏,但它 将 需要外部包装箱,static_assertions
. If you're looking for a std-only solution and can live with the uglier error message when the assertion fails, you can use this (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);
您可以在 static_assertions
crate 的作者所写的 the article 中阅读有关此技术及其改进方法的信息。
我的 Rust 程序中有一个枚举类型,其中一些变体可能包含内部数据。
enum MyEnum {
A,
B(u64),
C(SmallStruct),
D(Box<LargeStruct>)
}
这个枚举将被存储数万次,内存使用是一个问题。我想避免不小心为枚举添加一个非常大的变体。有没有一种方法可以告诉编译器限制内存中枚举实例的大小?
您可以使用 const_assert!
and mem::size_of
断言您的枚举小于或等于特定大小。
如其他答案所述,您可以使用 const_assert!
宏,但它 将 需要外部包装箱,static_assertions
. If you're looking for a std-only solution and can live with the uglier error message when the assertion fails, you can use this (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);
您可以在 static_assertions
crate 的作者所写的 the article 中阅读有关此技术及其改进方法的信息。