// 通过对斐波拉契函数的递归实现,来看看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;
}
// 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;
}