我决定用g++来检查循环不变码运动优化的结果。但是,当我使用-fmove-loop-invariants编译以下代码并分析其程序集时,我发现k + 17计算仍然在循环体中执行。
什么能阻止编译器优化它呢?
可能是编译器得出结论,认为重新计算k + 17更有效。
int main()
{
int k = 0;
std::cin >> k;
for (int i = 0; i < 10000; ++i)
{
int n = k + 17; // not moved out of the loop
printf("%d\n", n);
}
return 0;
}使用g++ -O0 -fmove-loop-invariants 4.6.3和g++ 4.8.3尝试了g++、g++ -O3和g++ -O3 -fmove-loop-invariants。
发布于 2016-02-14 03:12:34
编辑:忽略我以前的答案。你可以看到,计算被折成一个常数。因此,是执行循环不变优化的。
因为as-if rule。简单地说,编译器不允许进行任何可能影响程序可观察行为的优化,在本例中是printf。如果使n易失性并移除printf,您可以看到会发生什么情况。
for (int i = 0; i < 10000; ++i)
{
volatile int n = k + 17; // not moved out of the loop
}
// Example assembly output for GCC 4.6.4
// ...
movl $10000, %eax
addl $17, %edx
.L2:
subl $1, %eax
movl %edx, 12(%rsp)
// ...https://stackoverflow.com/questions/35387788
复制相似问题