C++11开始有constexpr,C++14、C++20持续增强,现在constexpr已经不再仅仅用来定义常量,函数、构造函数、vector、string都可以支持编译期执行。
constexpr核心价值:把一部分计算工作从程序运行阶段,提前挪到编译阶段。程序运行的时候,直接拿计算好的结果,节省运行时CPU开销。
区分容易混淆的关键字:
- const:代表变量不可修改,运行期常量为主;
- constexpr:保证可以在编译期求值,编译期常量。
下面是经常看到的限制与坑点:
1. C++11 constexpr函数限制极多,只能单行return;C++14放开分支、循环;
2. 编译期代码有独立的规则,很多运行期能调用的函数,constexpr里面不能调用;
3. 不要盲目全部写成constexpr,编译期计算会拉长编译时间,编译速度变慢;
4. constexpr不代表一定编译期执行,满足条件编译器才会在编译期求值,也可能降级到运行期。
适用场景:固定的数学查表、配置常量、静态校验、编译期参数合法性检查。在高性能底层库里面constexpr大量使用。
你有没有写过constexpr函数做编译期查表?