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++ const 和 constexpr的区别

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

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

C++ const 和 constexpr的区别

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

C++ const 和 constexpr的区别

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

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

参考:https://www.jianshu.com/p/34a2a79ea947
原文链接: https://www.cnblogs.com/FdWzy/p/12403611.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/193884

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午6:31
下一篇 2023年2月12日 下午6:31

相关推荐