Возможный дубликат:
С++: когда волатильный ключевой слово когда-либо помогал вам?
Я никогда не использовал его, но мне интересно, почему люди его используют? Что он делает? Я искал форум, я нашел его только на С# или в Java.
Возможный дубликат:
С++: когда волатильный ключевой слово когда-либо помогал вам?
Я никогда не использовал его, но мне интересно, почему люди его используют? Что он делает? Я искал форум, я нашел его только на С# или в Java.
Рассмотрим этот код,
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 - это намек на реализация избегать агрессивных оптимизация с участием объектапотому что значение объекта может быть изменено с помощью средств, не поддающихся обнаружению осуществление. [...]
Связанная тема:
Выполняет ли волатильность структуры все ее члены волатильны?
В компьютерном программировании, особенно на языках программирования C, С++ и С#, переменная или объект, объявленные с ключевым словом volatile
, обычно имеют специальные свойства, связанные с оптимизацией и/или потоками. Вообще говоря, ключевое слово volatile
предназначено для предотвращения (псевдо) компилятора от применения каких-либо оптимизаций кода, которые принимают значения переменных, не могут "сами по себе". (c) Википедия
Ключевое слово volatile - это спецификатор типа, используемый для объявления того, что объект может быть изменен в программе чем-то вроде операционной системы, оборудования или одновременно исполняемого потока.
volatile declarator;