performance-enum-size¶
Recommends the smallest possible underlying type for an enum
or enum
class based on the range of its enumerators. Analyzes the values of the
enumerators in an enum
or enum
class, including signed values, to
recommend the smallest possible underlying type that can represent all the
values of the enum
. The suggested underlying types are the integral types
std::uint8_t
, std::uint16_t
, and std::uint32_t
for unsigned types,
and std::int8_t
, std::int16_t
, and std::int32_t
for signed types.
Using the suggested underlying types can help reduce the memory footprint of
the program and improve performance in some cases.
For example:
// BEFORE
enum Color {
RED = -1,
GREEN = 0,
BLUE = 1
};
std::optional<Color> color_opt;
The Color enum
uses the default underlying type, which is int
in this
case, and its enumerators have values of -1, 0, and 1. Additionally, the
std::optional<Color>
object uses 8 bytes due to padding (platform
dependent).
// AFTER
enum Color : std:int8_t {
RED = -1,
GREEN = 0,
BLUE = 1
}
std::optional<Color> color_opt;
In the revised version of the Color enum
, the underlying type has been
changed to std::int8_t
. The enumerator RED has a value of -1, which can
be represented by a signed 8-bit integer.
By using a smaller underlying type, the memory footprint of the Color
enum
is reduced from 4 bytes to 1 byte. The revised version of the
std::optional<Color>
object would only require 2 bytes (due to lack of
padding), since it contains a single byte for the Color enum
and a single
byte for the bool
flag that indicates whether the optional value is set.
Reducing the memory footprint of an enum
can have significant benefits in
terms of memory usage and cache performance. However, it’s important to
consider the trade-offs and potential impact on code readability and
maintainability.
Enums without enumerators (empty) are excluded from analysis.
Requires C++11 or above. Does not provide auto-fixes.
Options¶
- EnumIgnoreList¶
Option is used to ignore certain enum types. It accepts a semicolon-separated list of (fully qualified) enum type names or regular expressions that match the enum type names. The default value is an empty string, which means no enums will be ignored.