performance-enum-size¶
根据枚举器的范围,推荐为 enum
或 enum
类使用尽可能小的底层类型。分析 enum
或 enum
类中枚举器的值(包括带符号的值),以推荐可以表示所有 enum
值的最小底层类型。建议的底层类型是用于无符号类型的整数类型 std::uint8_t
、std::uint16_t
和 std::uint32_t
,以及用于有符号类型的 std::int8_t
、std::int16_t
和 std::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¶
该选项用于忽略某些枚举类型。它接受一个以分号分隔的(完全限定的)枚举类型名称或与枚举类型名称匹配的正则表达式列表。默认值为一个空字符串,这意味着不会忽略任何枚举。