Рассмотрим цикл while в ANSI C, единственной целью которого является отсрочка выполнения:
unsigned long counter = DELAY_COUNT;
while(counter--);
Я видел, что это часто использовалось для обеспечения задержек во встроенных системах, где, например. нет функции sleep
, а таймеры или прерывания ограничены.
Мое чтение стандарта ANSI C состоит в том, что это может быть полностью устранено соответствующим компилятором. Он не имеет побочных эффектов, описанных в 5.1.2.3:
Доступ к изменчивому объекту, изменение объекта, изменение файла или вызов функции, выполняющей любые из этих операций, являются всеми побочными эффектами, которые являются изменениями состояния среды выполнения.
... и в этом разделе также говорится:
Фактическая реализация не должна оценивать часть выражения, если она может вывести, что ее значение не используется, и что не создаются необходимые побочные эффекты (в том числе любые вызванные вызовом функции или доступом к летучим объектам).
Означает ли это, что цикл можно оптимизировать? Даже если counter
были volatile
?
Примечания:
- Что это не совсем то же самое, что Разрешено ли компиляторам исключать бесконечные циклы?, поскольку это относится к бесконечным циклам, и возникают вопросы о том, когда разрешена программа вообще прекратить. В этом случае программа, безусловно, продолжит эту линию в какой-то момент, оптимизирует или нет.
- Я знаю, что делает GCC (удаляет цикл для
-O1
или выше, еслиcounter
не являетсяvolatile
), но я хочу знать, что диктует стандарт.