G.TYP.ENM.06 Enum内变体的大小差异不宜过大

【级别】 建议

【描述】

要注意 Enum 内变体的大小差异不要过大,因为 Enum 内存布局是以最大的变体进行对齐。根据场景,如果该Enum 实例中小尺寸变体的实例使用很多的话,内存就会有所浪费。如果小尺寸变体的实例使用很少,则影响不大。

解决办法之一为把大尺寸变体包含到 Box<T>中。

【反例】


#![allow(unused)]
fn main() {
// 不符合
enum Test {
    A(i32),
    B([i32; 1000]),
    C([i32; 8000]),
}
}

【正例】


#![allow(unused)]
fn main() {
// 符合
enum Test {
    A(i32),
    B(Box<[i32; 1000]>),
    C(Box<[i32; 8000]>),
}
}

【Lint 检测】

lint nameClippy 可检测Rustc 可检测Lint Grouplevel
large_enum_variantyesnoperfwarn

该 lint 可以通过 clippy 配置项 enum-variant-size-threshold = 200 来配置,默认是 200 字节。