当前位置:首页 > 引流 > 正文内容

常量表达式是指什么(c语言中常量表达式是什么意思)

admin3年前 (2022-10-21)引流615

C++11有许多改善特性,使得程序可以运行的更快。其中之一就是常量表示式,令程序可以重复利用编译期计算。如果你熟悉模板元编程,常量表示式看起来像一种令你更方便工作的工具。如果你不熟悉模板元编程,没有任何关系,常量表示式使得你更容易利用编译期计算能力。

常量表示式的基本思想是让确定可计算结果在编译期进行计算(就是代码被编译的时候),而不是程序运行的时候。这有一个明显的性能功率提升:如果一些工作可以在编译器完成,他只要计算一次,而不是每次运行驶路程序的过程中,都计算一次。假设咱们需要计算特定值的sin或者cos,当然你可以使用库函数进行计算,但是你付出的代价就是,运行期函数调用。使用常量表示式,你可以创建一个函数,在编译期为你计算这个值。

基本使用方法为了在编译期处理,你需要使用constexpr关键字:

常量表示式的另一大用处,你可以在原来使用的宏的地方,用这个函数代替。例如,你想要定义一个函数,基于一个乘子计算数组的长度。在之前的C++版本,你只能为此创建一个宏或者使用模板元编程的方式,因为不能使用函数调用的结果声明数组的长度。但是使用常亮表示式,你可以在数组声明的地方调用constexpr函数:

constexpr函数的限制一个constexpr函数有一些非常严格的限制:

只能由一个return语句组成(有几个例外)

只能调用其他constexpr函数

只能引用constexpr全局变量

注意,递归是没有被限制的。你如何在只由一个return语句组成的函数里使用递归呢?可以使用三元操作符(冒号问号操作符)。例如,下面是一个计算阶乘函数:

现在,你可以使用factorial(2),编译器在看到这个调用的时候,就会在编译期计算它。通过这种方式,constexpr可以进行更发杂的运算,constexpr函数表现的也跟纯粹的inline函数不一样,inline函数不允许递归!

constexpr函数中还可以做什么?

constexpr函数只能有一行可执行代码,但是它还可以包含其他内容:类型定义(typedef),using声明,指令(directive),静态断言(static_assert)。

constexpr和运行时一个函数被constexpr修饰,它仍然可以在运行时被调用,此时函数参数不是常量:

这意味着,你不需要为编译期和运行时分别定义函数。

编译期对象因为constexpr函数引用的任何变量都一定是constexpr的,那怎么才能利用对象呢?例如,怎么使用一个圆对象?

然后你希望可以像下面那样编译器获得圆对象,并且计算它的面积:

说实话,仅仅需要对Circle类做一些简单的改动,你就可以这样做。首先,咱们需要声明构造函数为constexpr,然后,咱们需要声明getArea函数为constexpr。将构造函数声明为constexpr,允许他在编译器运行,前提是他只包含初始化列表,且初始化使用其他constexpr构造函数。

constexpr 对比 const如果你将一个成员函数声明为constexpr,他也被认为是const的。(很明显,constexpr必定const,因为constexpr函数不能改写对象。)如果你将一个变量声明为constexpr,他也被认为是const的。但是反过来,都不成立。

constexpr和浮点数到目前为止,咱们看到的constexpr功能都可以用模板元编程的方式实现(虽然非常的复杂)。但是,使用constexpr有一个全新的能力,编译期计算浮点数。因为,无类型参数模板不支持浮点数,你很难使用模板元编程的方法在编译期计算浮点数。

另外C++长期因相当长的编译期时耗而备受诟病;constexpr是个高效的工具,但是他另外引入了编译期时耗。然而,有一些內建的特性可以优化这种时耗。首先,因为constexpr函数总是返回一样的输出值,他们可以被持久化,事实上GCC已经支持了memoization特性。

因为constexpr函数可以被持久化,用constexpr代替模板元编程,性能上不会更糟糕,而且易读性更有提升。再算上模板大量实例化的时耗的话,constexpr的性能反而更好。

最后,C++11标准允许编译器限制constexpr函数的最大递归(最少支持512层)。这一约束,防止的极端情况下的严重性能损耗。

扫描二维码推送至手机访问。

版权声明:本文中部分文字、图片、音频、视频来源于互联网及公开渠道,仅供学习参考,版权归原创者所有! 如侵犯到您的权益,请及时通知我们!我们将在第一时间内删除。

本文链接:http://www.73ya.com/yinliu/6031.html

分享给朋友:

“常量表达式是指什么(c语言中常量表达式是什么意思)” 的相关文章

短视频素材哪里找 玩短视频剪辑哪里找素材

随着短视频的发展,各大手机端剪辑app的出现,降低了短视频的门槛,而短时频的高收益也吸引了越来越多的自媒体人入局,从目前各项数据来看,短视频从业者已经远远超过了图文创作者。如今各大手机剪辑工具的出现,使得视频剪辑越来越简单便捷,即使零基础也能学会,但是对于独自一人做短视频的小伙伴来说,最...

短视频怎么做脚本,六个步骤你就懂了

做短视频的基础就是脚本,脚本是创作的基石,是贯穿这个视频始末的逻辑。很多小伙伴刚接触的时候对于短视频的了解仅仅是在观看短视频的层面上。但是其实短视频这一条路并不轻松。那么对于短视频脚本应该要怎么做呢?接下来就跟着小编一起来看看吧。 短视频怎么做脚本   01 镜头景别 镜头分为远景、全...

素材库视频免费下载,高清高质量等你来

刚接触短视频,大家最主要遇到的四大问题是——选题、写脚本、拍摄、剪辑。对于一个文案编辑者来说,素材来源有时候也可以提供灵感,对于一个视频剪辑后期来说,一个好素材也是非常重要的。善用素材,可以帮助你在制作短视频的过程中提高效率,提升质量。掌握了素材资源,玩转短视频也不是问题哦。今天,就给大...

手机图片修改器(专业修改照片的软件排行榜)

相信很多小伙伴都会遇到照片尺寸修改的问题,不清楚照片规定的尺寸是多大,还需要跑到照相馆找人帮忙,非常浪费时间。有没有一款操作方便的修改照片尺寸的工具?今天,小编就以一寸照片为例,给大家介绍怎么在线修改1寸照片尺寸的方法,有需要的小伙伴一起学习下吧! 1、打开压缩图网站,鼠标移入所有功能...

android音乐播放器的实现(做android音乐播放器的步骤)

无论是文字、图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 YUV、Bitmap,而对于音频来说,最简单常见的格式就是 wav 格式了。 wav 格式,与 bitmap 一样,都是微软开发的一种...

德云社全员名单图片(德云社所有搭档组合名单)

德云社是现在国内最大的相声班子,德云社之所以如此壮大,不仅与郭德纲的付出有很大关系,也与德云社的众多成员密不可分,德云社分为好多个辈分,也分为好多队,这一点大家都很清楚,每个辈分里都会有几个得意弟子,每个队里也都有队长一职,由于德云社成员越来越多,所以很多人都想要一个德云社成员名单表,以...