Должны ли переменные условия бесконечного цикла всегда объявляться как volatile? - PullRequest
0 голосов
/ 24 января 2012

Рассмотрим код такого типа,

while( !cond )
 ;

Если cond не объявлен как энергозависимый, компилятор может оптимизировать его, кэшируя в регистре.В этом случае цикл while будет продолжаться даже после установки cond .

Значит ли это, что любой такой тип переменной всегда должен быть объявлен volatile ?Почему компиляторы не достаточно умны, чтобы понять, что он не должен кэшировать такие переменные?

1 Ответ

10 голосов
/ 24 января 2012

Почему бы не кэшировать переменную? Вы не изменяете это в цикле, поэтому, по мнению Си, это эквивалентно while (true);.

То есть, если ваша программа не является многопоточной, в этом случае переменная может быть изменена , пока цикл работает и ничего не делает. Однако язык C ничего не знает о потоках (и в более общем смысле, как заметил Лундин, о любых функциях, которые не вызываются из main или из функции, вызываемой из main и т. Д.), Поэтому вам необходимо используйте volatile самостоятельно, чтобы сообщить C о том, что происходит, о чем он не знает.

...