我决定使用 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
,g++ -O3
并g++ -O3 -fmove-loop-invariants
同时使用 g++ 4.6.3 和 g++ 4.8.3。