performance-enum-size

根据枚举器的范围,推荐为 enumenum 类使用尽可能小的底层类型。分析 enumenum 类中枚举器的值(包括带符号的值),以推荐可以表示所有 enum 值的最小底层类型。建议的底层类型是用于无符号类型的整数类型 std::uint8_tstd::uint16_tstd::uint32_t,以及用于有符号类型的 std::int8_tstd::int16_tstd::int32_t。在某些情况下,使用建议的底层类型可以帮助减少程序的内存占用并提高性能。

例如

// BEFORE
enum Color {
    RED = -1,
    GREEN = 0,
    BLUE = 1
};

std::optional<Color> color_opt;

Color enum 使用默认的底层类型,在本例中为 int,其枚举器的值为 -1、0 和 1。此外,由于填充(平台相关),std::optional<Color> 对象使用 8 字节。

// AFTER
enum Color : std:int8_t {
    RED = -1,
    GREEN = 0,
    BLUE = 1
}

std::optional<Color> color_opt;

Color enum 的修订版本中,底层类型已更改为 std::int8_t。枚举器 RED 的值为 -1,可以用带符号的 8 位整数表示。

通过使用更小的底层类型,Color enum 的内存占用量从 4 字节减少到 1 字节。由于没有填充,std::optional<Color> 对象的修订版本将只需要 2 字节,因为它包含一个字节用于 Color enum 和一个字节用于指示可选值是否设置的 bool 标志。

减少 enum 的内存占用量在内存使用和缓存性能方面可以带来显著的益处。但是,务必考虑权衡以及对代码可读性和可维护性的潜在影响。

不包含枚举器的枚举(空)将被排除在分析之外。

需要 C++11 或更高版本。不提供自动修复。

选项

EnumIgnoreList

该选项用于忽略某些枚举类型。它接受一个以分号分隔的(完全限定的)枚举类型名称或与枚举类型名称匹配的正则表达式列表。默认值为一个空字符串,这意味着不会忽略任何枚举。