constexpr和const

const表示一个变量的值不能改变,这个值可以使运行期间得到的const int sz = get_size();
constexpr是提示编译器,该值可以在编译期间就计算出来,并进行替换,不用等到运行时计算,能够提升程序性能

constexpr的初衷就是,有些信息可以在编译期间进行利用,将能计算出来的都尽可能地计算出来,不必等到运行期间再计算
即,有些表达式和函数在编译期间就可以知道结果了

int sq(int N) {
  return N * N;
}

const int N = 123;
const int SQ_N = sq(N);

对于该代码段,N是在编译时就知道的,所以为何不直接在编译期将sq(123)的结果直接计算出来并进行替换?
上面的代码在编译期间就可以替换为

const int N = 123;
const int SQ_N = 15129;

不必等到运行时再计算

constexpr int sq(int n)
{
  return n * n;
}

int main()
{
  constexpr int N = 123;
  constexpr int N_SQ = sq(N);  printf("%d %d\n", N, N_SQ);
}

给函数传入一个const常量,函数内部只依赖常量进行计算,那么整个函数就可以在编译期间进行提前的计算从而进行替换
该函数从传入的参数到中间的运算流程都是可以在编译期间确切知道的

为了提示编译器可以这样做,规定在这样的函数前添加constexpr关键字
编译器就会尽可能地进行计算
C++11版本还不够完善,限定带有constexpr的函数内部只能有一条return语句,不可包括一些逻辑判断之类的
C++14版本就完善了,只要函数内部是只依赖常量进行计算,不依赖运行时才能知道的东西,就可以通过编译

尽管添加了constexpr,该函数还是可以像普通函数一样使用,能利用的时候编译器会进行替换,不影响普通调用

成员函数,构造函数前是否可以加上该关键字?

参考链接
https://blog.csdn.net/weixin_44638957/article/details/103851863

posted @ 2023-02-04 00:34  ecnu_lxz  阅读(27)  评论(0编辑  收藏  举报