constexpr 和 const
constexpr 是 C++11 引入的关键字,用于指示编译器在编译时计算常量表达式。这个关键字可以用于变量、函数和构造函数,具有以下几个主要特点和用途:
- 定义与用途
常量表达式:使用 constexpr 声明的变量或函数可以在编译时求值,以优化运行时性能。
适用于编译时计算:可以在编译时计算值,而不是在程序运行时计算,从而提高程序的效率。 - constexpr 变量
constexpr int max_value = 100; // 定义一个编译时常量
这种情况下,max_value 是一个常量,可以在编译时使用。 - constexpr 函数
constexpr int square(int x) {
return x * x; // 编译时计算
}
constexpr 函数的返回值可以在编译时计算,前提是传入的参数也是常量表达式。
例如:
constexpr int value = square(10); // value 在编译时被计算为 100
- constexpr 构造函数
在 C++14 及以后的版本中,constexpr 构造函数允许在运行时和编译时构造对象:
struct Point {
int x, y;
constexpr Point(int x, int y) : x(x), y(y) {}
};
constexpr Point p(1, 2); // p 在编译时构造
- 限制
constexpr 函数中只能包含简单的语句(如返回、算术运算、条件语句等),不能包含复杂的逻辑,如动态内存分配、循环等(在 C++14 及以后的版本中,限制有所放宽)。
参数必须是常量表达式。 - constexpr 与 const 的区别
const 关键字表示常量,但其值可以在运行时确定;而 constexpr 强调必须在编译时计算值。
constexpr 变量默认是 const 的,但 const 变量不一定是 constexpr。 - 使用场景
提高性能:通过在编译时计算常量,可以减少运行时计算的开销。
模板编程:在模板编程中,constexpr 可以用于生成类型安全的编译时常量。
固定数组大小:在定义数组时,可以使用 constexpr 作为数组大小的常量。
示例代码
include
constexpr int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
int main() {
constexpr int result = factorial(5); // 编译时计算
std::cout << "Factorial of 5 is " << result << std::endl; // 输出 120
return 0;
}
总结
constexpr 是 C++ 中一个强大的特性,使得程序可以在编译时进行更多的计算,从而提高效率和安全性。通过使用 constexpr,开发者可以更灵活地处理常量,利用编译时计算来优化程序性能。

浙公网安备 33010602011771号
ヾ(≧O≦)〃嗷~