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