Skip to content

constexpr(C++11)

一句话

告诉编译器"这个值或函数有能力在编译期算出来",从而把运行时的计算挪到编译期,实现零开销的复杂逻辑。

头文件

无(语言关键字)

核心 API 速查

操作签名说明
编译期变量constexpr T var = expr;要求 expr 是常量表达式,变量隐式 const
编译期函数constexpr T func(params);若参数为常量,则在编译期求值;否则退化为普通函数
编译期构造constexpr T::T(params);允许在常量表达式中构造字面量类型的对象
编译期析构constexpr T::~T();(C++20) 允许在常量表达式中销毁对象
特征测试宏__cpp_constexpr检测当前编译器对 constexpr 的支持级别

最小示例

cpp
// Standard: C++14
#include <iostream>

constexpr int factorial(int n) {
    int res = 1;
    while (n > 1) res *= n--;
    return res;
}

int main() {
    constexpr int val = factorial(5); // 编译期计算
    std::cout << val << '\n';         // 输出: 120
    int k = 4;
    std::cout << factorial(k) << '\n';// 运行期计算: 24
}

嵌入式适用性:高

  • 将查表、CRC校验、协议解析等计算提前到编译期,不占用 Flash/RAM 空间
  • 编译期计算的值可直接用作模板参数(如数组大小),满足裸机环境的静态配置需求
  • 相比 C 宏和模板元编程,代码可读性更强,调试体验更好
  • 需注意 C++11 限制较多(单 return 语句),建议嵌入式项目至少使用 C++14 标准

编译器支持

GCCClangMSVC
4.63.119.0

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建