constinit is a new keyword and specifier in C++20 which was proposed in P1143.
The following example is provided in the standard:
const
- What does
constinitmean? Why was it introduced? In which cases should we use it?
Initializing a variable with static storage duration might result in two outcomes¹:
The variable is initialized at compile-time (constant-initialization);
The variable is initialized the first time control passes through its declaration.
Case (2) is problematic because it can lead to the static initialization order fiasco, which is a source of dangerous bugs related to global objects.
The constinit keyword can only be applied on variables with static storage duration. If the decorated variable is not initialized at compile-time, the program is ill-formed (i.e. does not compile).
Using constinit ensures that the variable is initialized at compile-time, and that the static initialization order fiasco cannot take place.
- Does it make a variable immutable? Does it imply
constorconstexpr?
No and no.
However, constexpr does imply constinit.
- Can a variable be both
constandconstinit? What aboutconstexprandconstinit?
It can be both const and constinit. It cannot be both constexpr and constinit. From the wording:
At most one of the
constexpr,consteval, andconstinitkeywords shall appear in a decl-specifier-seq.
constexpr is not equivalent to const constinit, as the former mandates constant destruction, while the latter doesn't.
- To which variables can the specifier be applied? Why cannot we apply it to non-
static, non-thread_localvariables?
It can only be applied to variables with static or thread storage duration. It does not make sense to apply it to other variables, as constinit is all about static initialization.
- Does it have any performance advantages?
No. However, a collateral benefit of initializing a variable at compile-time is that it doesn't take instructions to initialize during program execution. constinit helps developers ensure that is the case without having to guess or check the generated assembly.
¹: See https://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables