Я решил проверить результат оптимизации движения инвариантного кода цикла с помощью 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.
РЕДАКТИРОВАТЬ: Игнорировать мой предыдущий ответ. Вы можете видеть, что расчет свернут в константу. Поэтому это является выполнение цикла инвариантной оптимизации.
Из-за как будто правило. Проще говоря, компилятору не разрешается делать какие-либо оптимизации, которые могут повлиять на наблюдаемое поведение программы, в этом случае 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)
// ...
Других решений пока нет …