C++ Constant Initialization | `constexpr`, `constinit`, and Static Order

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:

constexprconstinit
Init timecompile-timecompile-time
Mutate at runtimenoyes (if not const)
Wheremany contextsstatic/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 constexpr from non-constexpr functions.
  • Use constinit to lock in compile-time initialization when refactor might otherwise introduce dynamic init accidentally.
  • Use inline constexpr in 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).


  • constexpr functions
  • constexpr if
  • Value initialization
  • Zero initialization

Keywords

C++, constant initialization, constexpr, constinit, C++20.

See also

  • Constexpr series
  • Advanced constexpr