3

C语言中的i++和++i的执行效率一样吗?

 3 years ago
source link: https://blog.popkx.com/c%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84i%E5%92%8Ci%E7%9A%84%E6%89%A7%E8%A1%8C%E6%95%88%E7%8E%87%E4%B8%80%E6%A0%B7%E5%90%97/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C语言中的i++和++i的执行效率一样吗?

发表于 2019-08-16 08:08:48   |   已被 访问: 339 次   |   分类于:   C语言   |   暂无评论

本节来讨论一个比较有趣的话题:C语言中的 i++ 和 ++i,编译为程序后,它们的执行效率一样吗?

i++ 和 ++i 的执行效率一样吗?

i++;
++i;

就C语言代码来看,i++ 和 ++i 都只有一行,看起来似乎二者的执行效率一样了?其实不是的,在学习C语言时,教材和老师一般都会强调 i++ 和 ++i 的区别,例如下面这段C语言代码:

int i , j, k;

i = 0;
j = i++;

i = 0;
k = ++i;

这段C语言代码执行后,j 和 k 的值并不相等:j 等于 0,k 等于 1。既然执行结果有差异,那么执行效率很有可能也是有差异的,事实的确如此。查看上述C语言代码对应的汇编代码,如下:

4affa23da08e57b53ff6c52d13d74a46.png

我使用的编译器为 gcc version 4.8.4。

可见,j=i++; 计算机需要 4 条指令来解释,比执行 k=++i; 多出了一条指令。多出的一条指令为:在对 i 执行自加操作之前,先保存 i 的当前值留作稍后使用(赋值为j)。

这样看来,似乎 ++i 的执行效率比 i++ 高一些?

那为了写出效率更高的C语言程序,以后是不是应该尽量使用 ++i,而不是 i++ 了呢?例如下面这样的C语言代码:

for(i=0; i<10; i++);
for(i=0; i<10; ++i);

是不是上面那行C语言代码的执行效率低于下面的呢?只能说理论如此,实际上,现代C语言编译器已经足够聪明,它会根据上下文编译C语言代码。

应该明白,i++ 和 ++i 的效率差异主要来自于处理 i++ 时,需要先保存 i 的当前值留作稍后使用。如果之后没有人使用 i 的当前值,也就是说没有C语言代码读取 i++ 的值,编译器实在没有必要保存 i 的当前值了,因此就会将这一步优化掉。

为了便于分析,我们编写下面这样的C语言代码:

int  i = 0;
i++;
++i;

与上面的例子相比,区别在于在执行 i++ 时,没有人关心 i 的当前值了。查看这段C语言代码对应的汇编代码:

f8447b38fd306c041b8e3bd099ed5319.png

显然,i++ 和 ++i 对应的指令是一模一样的,不再有执行效率上的差异。

C语言中的 i++ 和 ++i 是有区别的,这就有可能带来效率上的差异。如果有代码关心 i++ 执行时的 i 当前值,程序在对 i 进行自加操作时,将不得不先保存 i 的当前值,而 ++i 就无需保存当前值,这就会带来效率上的差异。如果没人关心 i++ 的当前值,那么现代大多数C语言编译器将会将这一差异优化掉,此时 i++ 和 ++i 不再有效率上的差异。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK