首页 / 知识
C ++中的i ++和++ i之间是否存在性能差异?
2023-04-13 01:09:00

Is there a performance difference between i++ and ++i in C?如果不使用结果值, 执行摘要:没有。 由于 我们可以通过查看此函数的代码来演示这一点,都有
除
我们将编译它们,并获得生成的汇编程序:
我们可以看到生成的对象文件和汇编程序文件都是相同的。
型 从Andrew Koenig的效率与意图来看:
号 以及:
号 因此,如果不使用结果值,我将使用 一个更好的答案是, 每个人似乎都假设 但是,如果
另一个区别是,对于 使用迭代器是一个现实世界中出现这种情况的例子。复制迭代器在您的应用程序中不太可能是一个瓶颈,但是在不影响结果的情况下,养成使用 如果你担心微观优化,这里有一个额外的观察。递减循环"可能"比递增循环更有效(取决于指令集体系结构,如ARM),前提是:
在每个循环上,您将有一条指令,分别用于: 而递减循环:
循环将为以下各项提供指令: 当然,这只在递减为零时才有效! 从ARM系统开发人员指南中记起。 从Scott Meyers中获取叶,更有效的C++项目6:区分前缀和后缀形式的增量和减量运算。 在对象方面,尤其是在迭代器方面,前缀版本总是优于后缀版本。 如果您查看操作符的调用模式,那么会出现这种情况的原因。
看看这个例子,很容易看出前缀操作符总是比后缀更有效。因为使用后缀时需要临时对象。 这就是为什么当您看到使用迭代器的示例时,它们总是使用前缀版本。 但是正如您所指出的,对于int,实际上没有什么区别,因为编译器的优化可以发生。 简短回答: 在速度方面, 长回答: 其他所有答案都没有提到的是, 在 因此,虽然您可以假定
编译器也可以更有效地生成代码,例如:
仅仅因为你作为一个C程序员被训练成认为后缀 因此,在C语言中前缀和后缀 "前缀 型 请不要让"哪一个更快"的问题成为决定使用哪一个的因素。很可能你永远不会那么在意,而且,程序员阅读时间比机器时间要贵得多。 使用对人类来说最有意义的代码。 型 首先: 到细节。 1.众所周知的C++问题:EDCOX1〔1〕更快。 在C++中,EDOCX1×1是更有效的IFF EDCOX1,4是一种具有过载增量运算符的对象。 为什么?在 如上所述,这不适用于基本类型。 2.第二步。鲜为人知的事实是: 如果不需要调用构造函数/析构函数(在C中总是如此),那么 型 @标记即使编译器可以优化掉变量的临时副本(基于堆栈),而gcc(在最新版本中)正在这样做,并不意味着所有编译器都会这样做。 我刚刚用我们在当前项目中使用的编译器测试了它,4个编译器中有3个没有优化它。 永远不要假设编译器能够正确地完成任务,特别是如果代码可能更快,但速度永远不会变慢,那么就很容易阅读。 如果代码中没有一个真正愚蠢的运算符实现: Alwas更喜欢++I而不是I++。 在C语言中,如果结果未被使用,编译器通常可以将它们优化为相同的。 但是,在C++中,如果使用提供自己的++操作符的其他类型,前缀版本可能会比后缀版本快。因此,如果不需要后缀语义,最好使用前缀操作符。 型 我可以想到一种情况,即后缀比前缀增量慢: 假设一个寄存器为 现在想象一下下面的程序及其翻译成一个假设的程序集: 前缀增量:
后缀增量:
号 注意如何强制重新加载EDOCX1[2]的值。使用前缀增量,编译器可以增加值并继续使用它,可能避免重新加载它,因为所需的值已经在增量之后的寄存器中。但是,对于后缀增量,编译器必须处理两个值,一个是旧值,另一个是增量值,正如我上面所示,这将导致更多的内存访问。 当然,如果不使用增量值,例如单个 作为旁注,我想说的是,有一个 型 不过,我总是喜欢预增量… 我想指出的是,即使在调用operator++函数的情况下,如果函数是内联的,编译器也能够优化临时函数。由于operator++通常很短,并且常常在头中实现,因此它很可能是内联的。 因此,出于实际目的,这两种形式的性能可能没有太大差别。但是,我总是更喜欢预增量,因为它似乎更好地直接表达我想说的内容,而不是依赖于优化器来解决。 另外,给optmizer更少的操作可能意味着编译器运行得更快。 我的C有点生锈,所以我提前道歉。很快,我就能理解结果。但是,对于这两个文件是如何输出到同一个MD5哈希的,我感到困惑。也许for循环运行相同,但以下两行代码不会生成不同的程序集吗?
VS
第一个将值写入数组,然后递增i。第二个将值写入数组。我不是汇编专家,但我不知道这两行代码如何生成相同的可执行文件。 就我的两分钱。 |
最新内容
相关内容
python如何让程序暂停执行和继续执
python如何让程序暂停执行和继续执行?,暂停,培训,程序,继续,空格键,函数,以上,操作,方法,更多,python让程序继续执行的方法:一、使用到的函数python如何获取程序执行时间?
python如何获取程序执行时间?,代码,培训,标准,程序,方法,中间,使用方法,以上,手册,更多,python获取程序执行时间的方法:1、使用time.clock()方python判断xml是否存在某一节点?
python判断xml是否存在某一节点?,数据,培训,节点,方法,结果,表达式,长度,以上,更多,内容,python中判断xml是否存在某一节点的方法:使用selectNpython如何查找是否存在某个变量?
python如何查找是否存在某个变量?,培训,变量,函数,定义,属性,参数,字典,对象,类型,方法,python中可以使用locals()、dir()、vars()等函数来查python如何查找是否存在某个变量?
python如何查找是否存在某个变量?,培训,变量,函数,定义,属性,参数,字典,对象,类型,方法,python中可以使用locals()、dir()、vars()等函数来查批处理怎么执行Python程序
批处理怎么执行Python程序,培训,方式,文件,程序,脚本,文件夹,路径,命令,以上,格式,批处理执行Python程序的方式:第一种方式:@echooffC:cdC:\Upython执行报错有哪些原因
python执行报错有哪些原因,时报,培训,横线,标点符号,错误,原因,目录,法名,程序,都会,python执行时报错,可能是以下的几种原因1、运行出现objeccmd中如何执行Python文件
cmd中如何执行Python文件,第一,名称,培训,文件夹,目录,文件,驱动器,序列号,指令,路径,以进入D盘文件夹,安装python第三方库pip为例:第一种方法_如何中断python的执行
如何中断python的执行,暂停,时间,培训,模块,语句,可能会,有所不同,长短,上下,手段,在Python3中已经有很大一部分语句与Python2不互通了,运行暂pythonlinux如何执行python
pythonlinux如何执行python,培训,代码,脚本,文件,文本,权限,之后,绝对路径,程序,头部,linux运行python脚本的方法:1、命令行执行:建立一个test.python怎么检查变量是否存在
python怎么检查变量是否存在,培训,变量,方法,语句,字典,局部,函数,以上,两个,方式,python中判断变量是否存在方法一:使用try:...exceptNameErrpython怎么检查文件是否存在
python怎么检查文件是否存在,检测,培训,异常,名字,文件,模块,文件夹,方法,语句,操作,python检查文件是否存在的方法:os模块中的os.path.exists