毕业论文
您现在的位置: 语言识别 >> 语言识别前景 >> 正文 >> 正文

有趣的C语言语法i和i的执行效率

来源:语言识别 时间:2024/10/10
本节来讨论一个比较有趣的话题:C语言中的i++和++i,编译为程序后,它们的执行效率一样吗?执行效率一样吗?i++和++i的执行效率一样吗?i++;++i;就C语言代码来看,i++和++i都只有一行,看起来似乎二者的执行效率一样了?其实不是的,在学习C语言时,教材和老师一般都会强调i++和++i的区别,例如下面这段C语言代码:inti,j,k;i=0;j=i++;i=0;k=++i;这段C语言代码执行后,j和k的值并不相等:j等于0,k等于1。既然执行结果有差异,那么执行效率很有可能也是有差异的,事实的确如此。查看上述C语言代码对应的汇编代码,如下:C语言代码对应的汇编代码我使用的编译器为gccversion4.8.4。可见,j=i++;计算机需要4条指令来解释,比执行k=++i;多出了一条指令。多出的一条指令为:在对i执行自加操作之前,先保存i的当前值留作稍后使用(赋值为j)。这样看来,似乎++i的执行效率比i++高一些?那为了写出效率更高的C语言程序,以后是不是应该尽量使用++i,而不是i++了呢?例如下面这样的C语言代码:for(i=0;i10;i++);for(i=0;i10;++i);是不是上面那行C语言代码的执行效率低于下面的呢?只能说理论如此,实际上,现代C语言编译器已经足够聪明,它会根据上下文编译C语言代码。编译器会根据上下文编译C语言代码应该明白,i++和++i的效率差异主要来自于处理i++时,需要先保存i的当前值留作稍后使用。如果之后没有人使用i的当前值,也就是说没有C语言代码读取i++的值,编译器实在没有必要保存i的当前值了,因此就会将这一步优化掉。为了便于分析,我们编写下面这样的C语言代码:inti=0;i++;++i;与上面的例子相比,区别在于在执行i++时,没有人关心i的当前值了。查看这段C语言代码对应的汇编代码:对应的汇编代码显然,i++和++i对应的指令是一模一样的,不再有执行效率上的差异。小结C语言中的i++和++i是有区别的,这就有可能带来效率上的差异。如果有代码关心i++执行时的i当前值,程序在对i进行自加操作时,将不得不先保存i的当前值,而++i就无需保存当前值,这就会带来效率上的差异。如果没人关心i++的当前值,那么现代大多数C语言编译器将会将这一差异优化掉,此时i++和++i不再有效率上的差异。点个赞再走吧欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就

转载请注明:http://www.0431gb208.com/sjsbszl/7736.html