Я хотел бы добавить, что volatile также очень полезен при работе с многопоточными приложениями, т.е. у вас есть основной поток (где живет main ()), и вы создаете рабочий поток, который будет продолжать вращаться, пока переменная app_running имеет значение true. main () контролирует, является ли app_running истинным или ложным, поэтому, если вы не добавите атрибут volatile к объявлению app_running, если компилятор оптимизирует доступ к app_running в коде, выполняемом вторичным потоком, main ( ) может изменить "app_running" на false, но вторичный поток продолжит работу, потому что значение было кэшировано. Я видел такое же поведение при использовании gcc в Linux и VisualC ++. Атрибут "volatile", помещенный в объявление "app_running", решил проблему. Так,
volatile
объекты также могут быть изменены процессами, вообще не задействующими ЦП. Например, регистр приема байтов в коммуникационном периферийном устройстве может увеличиваться на единицу при получении байта (и это может даже вызвать прерывание). Другой пример - регистр флагов ожидающих прерываний в периферийном устройстве.