Идея ключевого слова volatile
заключается именно в том, чтобы указать компилятору, что переменная, помеченная как таковая, может неожиданно измениться во время выполнения программы.
Однако это не делает его источником«случайные числа» - это просто советует компилятору - то, что отвечает за фактическое изменение содержимого переменной, должно быть другим процессом, потоком, некоторым аппаратным прерыванием - всем, что записывает в память процесса, но не встраивается в функцию, где находит изменяемое объявлениесам.В «старые времена» (компиляторы с меньшим количеством магии) все, что он делал, не давало компилятору кэшировать значение переменной в одном из регистров ЦП.Я понятия не имею о стратегиях оптимизации / де-оптимизации, запускаемых им современными компиляторами - но он по крайней мере сделает это.
В отсутствие любого такого внешнего фактора переменная «volatile» так же, каклюбой другой.На самом деле - это так же, как и любая другая переменная - поскольку переменные, не помеченные как volatile, также могут быть изменены по тем же внешним причинам (но скомпилированный код C не будет подготовлен для этого в этом случае, что может привести к использованию неправильных значений).