There is a syntax error in the provided code example - this PR fixes it. I did a quick search - I could not find similar _typos_.
75 lines
2.5 KiB
ReStructuredText
75 lines
2.5 KiB
ReStructuredText
.. title:: clang-tidy - performance-enum-size
|
|
|
|
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:
|
|
|
|
.. code-block:: c++
|
|
|
|
// 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).
|
|
|
|
.. code-block:: c++
|
|
|
|
// 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
|
|
-------
|
|
|
|
.. option:: 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.
|