C++ 语言特性17 - constexpr

一:概述

        constexpr 是 C++11 引入的关键字,用于在编译时评估表达式并生成常量值。这可以提高性能和代码的可读性,减少运行时计算。

二:举例

        1. 编译时常量表达式

  constexpr的主要用途是确保某些表达式在编译时计算。例如,数学计算、常量初始化等场景下,可以用constexpr代替const来强制在编译时执行计算

constexpr int square(int x) {
    return x * x;
}

constexpr int result = square(5);  // 编译时计算 result 的值为 25

        2. 常量成员函数

       当类的某些成员函数可以在编译时计算时,可以将其声明为constexpr。在这样的函数中,只要输入是编译时常量,返回值也会在编译时确定。

struct Point {
    int x, y;
    constexpr Point(int xVal, int yVal) : x(xVal), y(yVal) {}
    constexpr int getX() const { return x; }
    constexpr int getY() const { return y; }
};
constexpr Point p(1, 2);
constexpr int x = p.getX();  // 在编译时计算

       3. 如果需要在编译时确定数组的大小,可以使用constexpr来计算数组的大小。

constexpr int getSize() {
    return 10;
}
int arr[getSize()];  // 数组大小在编译时确定

        4. constexpr函数支持递归

        这使得复杂的计算也可以在编译时完成。注意,递归的深度不能超出编译器的限制。

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : (n * factorial(n - 1));
}
constexpr int result = factorial(5);  // 编译时计算 result 为 120

三: 注意事项

 1. 函数体限制

        在 C++11 中,constexpr函数的函数体必须是单一的 return 语句,C++14 以后可以包含更多复杂的语句,比如条件判断、循环等。下面是 C++11 和 C++14 对函数体的不同要求:

// C++11 constexpr 函数(单个return语句)
constexpr int add(int a, int b) {
    return a + b;
}

// C++14 constexpr 函数(可以包含条件判断)
constexpr int max(int a, int b) {
    if (a > b) return a;
    else return b;
}

2. 局限性

 constexpr函数不能包含运行时只能执行的操作,例如:

  • 不能抛出异常
  • 不能使用 new 或动态内存分配
  • 不能有运行时依赖的函数调用

3. 编译时和运行时调用

   constexpr函数可以在编译时和运行时调用。如果参数是常量表达式,编译器会在编译时计算结果;如果参数不是常量表达式,函数会在运行时执行.

constexpr int sum(int a, int b) {
    return a + b;
}
int x = 5;
int result1 = sum(3, 4);  // 编译时计算
int result2 = sum(x, 4);  // 运行时计算

4. 构造函数中的constexpr

         从C++11开始,类的构造函数可以声明为constexpr。这意味着可以使用constexpr构造常量对象,前提是所有成员变量的初始化也是常量表达式。

5. constexpr vs const

  • constexpr 确保编译时计算,而 const 表示常量但不保证编译时计算。
  • const对象可以在运行时初始化,而constexpr对象必须在编译时初始化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑不溜秋的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值