打印

C++:constexpr用法

[复制链接]
109|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2023-3-7 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, TE
constexpr是c++11新添加的特征,目的是将运算尽量放在编译阶段,而不是运行阶段。这个从字面上也好理解,const是常量的意思,也就是后面不会发生改变,因此当然可以将计算的过程放在编译过程。constexpr可以修饰函数、结构体。

使用特权

评论回复

相关帖子

沙发
keer_zu|  楼主 | 2023-3-7 14:33 | 只看该作者
修饰函数

    • 修饰的函数只能包括return 语句。
    • 修饰的函数只能引用全局不变常量。
    • 修饰的函数只能调用其他constexpr修饰的函数。
    • 函数不能为void 类型和,并且prefix operation(v++)不允许出现。


下面通过一个例子来进一步说明:
// 通过对斐波拉契函数的递归实现,来看看constexpr具体怎么修饰函数,同时比较这样使用的好处
#include<iostream>
#include<time.h>
using namespace std;
//在这个函数里面,由于constexpr稀释的是fib1这个函数,因此每一次计算的结果都会作为一个常量保存下来
//这个实现的复杂度等同于迭代的方法,基本上为O(n)。
constexpr long int fib1(int n)
{
        return (n <= 1)? n : fib1(n-1) + fib1(n-2); //只能包含一个retrun语句
}
//熟悉递归函数就不难证明下面这个函数的时间复杂度为O(2^n)
long int fib2(int n){
        return (n <= 1)? n : fib(n-1) + fib(n-2);
}
int main ()
{
        // value of res is computed at compile time.
          clock_t start, end;
          start = clock();
        const long int res = fib1(30);
          end = clock();
          cout << "Totle Time fib1 : " <<(double)(end - start) / CLOCKS_PER_SEC << "s" << endl;
          start = clock();
        const long int res = fib2(30);
          end = clock();
          cout << "Totle Time fib2 : " <<(double)(end - start) / CLOCKS_PER_SEC << "s" << endl;
        cout << res;
        return 0;
}



使用特权

评论回复
板凳
keer_zu|  楼主 | 2023-3-7 14:33 | 只看该作者
修饰结构体:


// C++ program to demonstrate uses of constexpr in constructor 
#include <bits/stdc++.h>
using namespace std;
// A class with constexpr constructor and function
class Rectangle
{
int _h, _w;
public:
        // 修饰一个结构体
        constexpr Rectangle (int h, int w) : _h(h), _w(w) {}
        // 修饰一个函数,_h, _w为全局,并且在实例化时就已经是初始化后的常量了
        constexpr int getArea () { return _h * _w; }
};
int main()
{
        // 对象在编译时就已经初始化了
        constexpr Rectangle obj(10, 20);
        cout << obj.getArea();
        return 0;
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1314

主题

12271

帖子

53

粉丝