constexpr函数可在编译期求值,提升性能;2. 定义时需加constexpr关键字,调用时参数为常量表达式则在编译期执行;3. C++14起允许局部变量、循环等,但仍需返回编译期确定的值。

在C++中,constexpr函数是一种可以在编译期求值的函数,前提是传入的参数是常量表达式。使用constexpr可以提升程序性能,让计算在编译时完成,减少运行时开销。
constexpr函数的基本用法
constexpr函数的定义方式和普通函数类似,只需在返回类型前加上constexpr关键字。函数体通常要满足在编译期可计算的要求。
constexpr int square(int x) {
return x * x;
}
int main() {
constexpr int val = square(5); // 编译期计算,val = 25
int arr[val]; // 可用于定义数组大小
return 0;
}
只要调用时参数是常量表达式,函数就会在编译期执行。如果参数是变量,则退化为普通函数在运行时执行。
constexpr函数的限制与要求
从C++11到C++14、C++17,constexpr函数的支持不断增强,但仍有基本规则需要遵守:
立即学习“C++免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
- 函数体不能包含:动态内存分配(new/delete)、全局或静态变量修改、try-catch等复杂语句(C++11中尤其严格)
- 必须返回一个可在编译期确定的值
- 所有参数也应是常量表达式才能触发编译期求值
constexpr int factorial(int n) {
int result = 1;
for (int i = 2; i <= n; ++i)
result *= i;
return result;
}
这个版本在C++14及以上是合法的,可在编译期计算阶乘。
如何确保在编译期执行
即使函数被声明为constexpr,是否在编译期执行还取决于调用上下文。
- 使用
constexpr变量接收结果,强制编译器在编译期求值 - 用于数组大小、模板非类型参数、枚举值等需要常量表达式的地方
int x = 4; int runtime_val = square(x); // 运行时执行,合法但不编译期计算
与const的区别
const表示“不可修改”,而constexpr强调“编译期常量”。constexpr隐含const,但反过来不成立。
constexpr int a = 10; // 编译期常量 const int b = 10; // 运行时初始化也可以,不一定是编译期常量
基本上就这些。合理使用constexpr能提高效率,特别是在数学计算、容器大小、模板编程中非常有用。注意编译器支持和标准版本即可。










