如果你的项目里还有一堆在 main() 启动时才初始化的常量表、映射表、配置项,我建议找个下午把它们全部改成 constexpr。说句实话,大多时候这不会让程序快到你肉眼可见,但代码的安全感完全不一样——表在编译期就算好了,静态断言把数据给校验完了,运行时只能老老实实读,想错都难。C++ 的 constexpr 关键字从 C++11 进入标准以来,已经默默改变了无数人写代码的方式,但很多人对它还停留在“能算常量”的层面。这篇文章我会从 constexpr 的版本演进讲起,结合一个完整的编译期字符串查找表实战,把静态表达式的适用范围、边界、常见翻车点一次说清楚。适合刚开始学现代 C++ 的开发者,也适合写工具库、协议解析、游戏配置时被运行时初始化折磨的同行参考。
1. 从 const 到 constexpr:静态计算的前世今生
1.1 编译期计算是什么,它和运行期有什么关系
先回答一个问题:什么叫编译期计算?就是你写程序的时候,编译器把一部分运算提前做完,而不是等你点了运行按钮之后才做。举个特别简单的例子,如果你在代码里写 int x = 2 + 3;,几乎所有编译器都会直接生成 5 的立即数,而不是在运行时
