编译器优化

问题描述 投票:0回答:1

-o2 和 -o3 级的优化器将循环转换为 示例 2−30(a) 类似于示例 2−30(b) 中的代码。

我不明白为什么编译器要进行这样的优化?递减计数和递增计数有什么区别吗?

c optimization compiler-optimization
1个回答
1
投票

是的。

大多数 CPU 都有内部算术标志,用于保存最后一次算术运算的数据。 这样的标志之一是“零标志”,当结果为零时设置它。 因此,当循环计数器从

N
递减到 0 时,一旦达到 0,就足以执行一个仅检查零标志的操作,以便知道是否达到循环退出条件。

当循环计数器从 0 增加到

N
时,每次迭代都需要在当前循环计数器和
N
之间进行比较(在大多数情况下基本上是减法操作),然后检查零标志(以捕获当循环计数器等于
N
) 时的情况。

因此,在情况 (b) 中,与情况 (a) 相比,您执行的操作少了一项。

© www.soinside.com 2019 - 2024. All rights reserved.