C++ const 和 constexpr的区别

const只是声明变量类型/函数返回类型为常量,不能改动。

 

constexpr修饰变量/函数是显式告知编译器“我是常量,不要在多费功夫了,直接把我替换为常量加入汇编代码!”。

比如下面这样的函数或者变量都是这种情况:

1 constexpr int x=1;
2 int constexpr f(){
3     return 1;
4 }
C++11中的constexpr指定的函数返回值和参数必须要保证是字面值,而且必须有且只有一行return代码,这给函数的设计者带来了更多的限制,比如通常只能通过return 三目运算符+递归来计算返回的字面值。
函数中除了return还有一个没卵用的表达式,C++11就会报错:

 

 

但C++14之后就不再有这么严格的限制了,只要保证返回值和参数是字面值就行了,函数体中可以加入更多的语句,方便了更灵活的计算。

上面一样的代码在C++17下跑就可以运行成功:

 

 

 

 

 

对于较新的C++编译器,constexpr更多的是一个建议,即使你的函数中甚至都返回的不是常量,编译器也不会报错,而是把它当成一个普通函数对待,如下:

注:这里我发现我的编译器居然能用变量来声明数组大小。后来查了相关资料,发现这是C99的特性,本来C++是不支持的,但应该是我下的mingw库自带支持C99的关系。这个可以忽略,平时不要这么写!

 

也就是说编译器还是很聪明的,你骗编译器说我是一个返回常量的函数,但编译器还是会检查并决定到底要不要优化你,如果发现你骗了它也不会报错。

 

 

参考:https://www.jianshu.com/p/34a2a79ea947

posted @ 2020-03-03 17:47  NeoZy  阅读(629)  评论(0编辑  收藏  举报