C++ Constant Initialization | `constexpr`, `constinit`, and Static Order
이 글의 핵심
Constant initialization fixes values at compile time; pair it with understanding of zero init, dynamic init, and `constinit` for globals.
What is constant initialization?
Constant initialization initializes an object with a value fixed at compile time (constant expression). Contrast with dynamic initialization that runs before main but executes runtime code.
Works with constexpr functions and constexpr if; distinguish from value initialization and zero initialization.
constexpr int x = 10; // constant initialization
int y = compute(); // dynamic initialization (runtime)
Why it matters
- Performance: no runtime init cost for that object
- Safety: avoids cross-TU static initialization order hazards for data that can stay constexpr
- Optimization: lets the compiler embed values directly
constexpr variables
Typical uses: array bounds, switch cases, non-type template arguments, lookup tables.
constinit (C++20)
constinit guarantees constant initialization for static/thread_local objects, but unlike constexpr the object may still be mutable at runtime (unless also const).
Compare:
constexpr | constinit | |
|---|---|---|
| Init time | compile-time | compile-time |
| Mutate at runtime | no | yes (if not const) |
| Where | many contexts | static/thread_local only |
Initialization order recap
Static storage duration objects: typically zero-init, then constant init where applicable, then dynamic init for the rest.
Cross-TU dynamic order is unspecified—design so globals do not depend on each other’s dynamic init.
Pitfalls & practice
- Do not expect
constexprfrom non-constexprfunctions. - Use
constinitto lock in compile-time initialization when refactor might otherwise introduce dynamic init accidentally. - Use
inline constexprin headers to avoid ODR violations.
FAQ
See Korean article Q&A—topics include performance, order phases, constinit vs constexpr, and learning resources (cppreference — constant initialization).
Related posts
constexprfunctionsconstexpr if- Value initialization
- Zero initialization
Keywords
C++, constant initialization, constexpr, constinit, C++20.
See also
- Constexpr series
- Advanced constexpr