Ответ 1

Рассмотрим этот код,

int some_int = 100;

while(some_int == 100)
{
   //your code
}

Когда эта программа компилируется, компилятор может оптимизировать этот код, если обнаруживает, что программа никогда никогда не делает попытку изменить значение some_int, поэтому может возникнуть соблазн оптимизировать цикл while, изменив его с while(some_int == 100) на просто while(true), чтобы выполнение могло быть быстрым (поскольку условие в цикле while всегда равно true). (если компилятор не оптимизирует его, тогда он должен получить значение some_int (если он не загружен в регистр) и сравнить его со 100, каждый раз, который, очевидно, немного медленный.)

Однако иногда оптимизация (некоторых частей вашей программы) может быть нежелательной, потому что может быть, что кто-то другой меняет значение some_int из вне программы, что компилятор не знает о, поскольку он не может его увидеть; но как вы его разработали. В этом случае оптимизация компилятора будет не выдавать желаемый результат!

Итак, чтобы обеспечить желаемый результат, вам нужно как-то остановить компилятор от оптимизации цикла while. Именно здесь ключевое слово volatile играет свою роль. Все, что вам нужно сделать, это,

volatile int some_int = 100; //note the 'volatile' qualifier now!

В других словах я бы объяснил это следующим образом:

volatile сообщает компилятору, что

"Эй, компилятор, я неустойчивый, и ты знаю, меня может изменить какой-то XYZ о котором вы даже не подозреваете. Что XYZ может быть чем угодно. Может быть, некоторые инопланетянин за пределами этой планеты программа. Возможно, какое-то освещение, некоторые форма прерывания, вулканы и т.д. мутируйте меня. Может быть. Вы никогда не знаете, кто меня изменит! Итак, ты невежественный, перестаньте играть всезнающим бог, и не смей трогать код где я присутствую. Хорошо?"

Ну, вот как volatile не позволяет компилятору оптимизировать код. Теперь перейдите в Google, чтобы увидеть примеры примеров.


Цитата из стандарта С++ ($ 7.1.5.1/8)

[..] volatile - это намек на реализация избегать агрессивных оптимизация с участием объектапотому что значение объекта может быть изменено с помощью средств, не поддающихся обнаружению осуществление. [...]

Связанная тема:

Выполняет ли волатильность структуры все ее члены волатильны?

Ответ 2

В компьютерном программировании, особенно на языках программирования C, С++ и С#, переменная или объект, объявленные с ключевым словом volatile, обычно имеют специальные свойства, связанные с оптимизацией и/или потоками. Вообще говоря, ключевое слово volatile предназначено для предотвращения (псевдо) компилятора от применения каких-либо оптимизаций кода, которые принимают значения переменных, не могут "сами по себе". (c) Википедия

http://en.wikipedia.org/wiki/Volatile_variable

Ответ 3

Ключевое слово volatile - это спецификатор типа, используемый для объявления того, что объект может быть изменен в программе чем-то вроде операционной системы, оборудования или одновременно исполняемого потока.

volatile declarator;