【发布时间】:2015-08-01 22:27:08
【问题描述】:
例子:
for (int i = 0; i < a[index]; i++) {
// do stuff
}
a[index] 每次都会被读取吗?如果不是,如果有人想在循环中更改a[index] 的值怎么办?我自己没见过,但是编译器会做出这样的假设吗?
如果条件改为i < val-2,是否每次都会对其进行评估?
【问题讨论】:
-
应该很容易编写一个测试程序来确认这一点。
-
@OliverCharlesworth 你是对的。但也许有人对为什么事情是一种特定的方式有一些有趣的意见?
-
@user2864740 但是每次迭代都会加载一个[index] 吗? val-2 是否也每次都被评估?
-
@UserNotDefined “加载”必须在每次评估时发生,除非编译器可以绝对保证它不能在其他地方修改(或导致另一个副作用):在一般情况下这是不可能的。即使可以进行这样的优化,它也完全取决于使用的编译器和标志;查看特定编译器的输出(GCC 的 -S 标志)可能在这里有用。
-
@OliverCharlesworth:这实际上只是确认编译器生成的代码确实(不)优化了访问。但这不是一个有效的一般证明。