Почему компиляторы кажутся вежливыми в отношении циклов, которые ничего не делают и не устраняют их?
Требуется ли в стандарте C цикл цикла?
Пример: следующий код:
void foo(void) {
while(1) {
for(int k = 0; k < 1000000000; ++k);
printf("Foo\n");
}
}
работает медленнее, чем этот:
void foo(void) {
while(1) {
for(int k = 0; k < 1000; ++k);
printf("Foo\n");
}
}
даже с уровнем оптимизации -O3
.
Я ожидал бы, что удаление пустых петель будет разрешено и, таким образом, получить одинаковую скорость для обоих кодов.
"Время затрачено" на побочный эффект, который должен быть сохранен компилятором?