constexpr 是 C++ 编译期计算的核心机制。从 C++11 的起步到 C++20 的全面支持,constexpr 的能力不断扩展,让越来越多的代码可以在编译期执行。
constexpr 的演进
- C++11:constexpr 函数体只能包含一条 return 语句。
- C++14:允许多条语句、循环、局部变量。
- C++17:lambda 可以是 constexpr。
- C++20:支持动态内存分配(编译期 new/delete)、try-catch、virtual 函数。
// C++20: 编译期分配内存
constexpr auto createArray(int n) {
auto v = std::vector<int>{};
for (int i = 0; i < n; ++i)
v.push_back(i * i);
return v;
}
constexpr auto squares = createArray(10); // 编译期计算
consteval 与 constinit
C++20 引入了两个新的编译期关键字:
- consteval:立即函数,必须在编译期求值,否则编译错误。
- constinit:保证变量在编译期初始化,避免静态初始化顺序问题。
编译期编程的威力
将计算从运行时移到编译期有三大好处:零运行时开销、更早的错误发现、更小的二进制体积。配合模板元编程,constexpr 可以在编译期生成高度优化的代码。
越多的代码在编译期执行,越少的 bug 在运行时出现。