This article提供了一个示例C代码片段,由于没有为循环计数器类型定义溢出,编译器可以对其进行优化.
以下是带有 comments 的代码片段
for (i = 0; i <= N; ++i) { ... }
在此循环中,如果溢出时未定义"i",则编译器可以假定循环将恰好迭代N+1次,这允许广泛的循环优化.另一方面,如果变量被定义为在溢出时绕回,那么编译器必须假设循环可能是无限的(如果N是INT_MAX就会发生)-这将禁用这些重要的循环优化.这特别影响64位平台,因为很多代码都使用"int"作为归纳变量.
我有不少疑问:
- 我知道,如果溢出时未定义
i
的类型,编译器可以假定i
不会回绕,但为什么这意味着循环运行N+1
次?难道不能在循环体中更改i
吗? - 即使考虑到这一假设,它还能在此基础上进行什么优化呢?例如,如果在编译时不知道
N
,那么循环就不能被展开,对吗? - "大范围的循环优化"让我觉得我在这里错过了很多.