Указатель в памяти может быть виден другим частям той же или другой программы. Например, переменная, которая существует в общей памяти и может быть изменена другой программой.
Компилятор не может обнаружить это.
Другими примерами являются аппаратные области памяти.
Как правило, приложения, которым требуются переменные переменные, обычно работают с такими вещами, как асинхронное аудио, а на системном уровне - с прерываниями, API C и c. Большинству приложений они не нужны.
Воображаемый пример:
int v = 0;
// Some thread
SetUpdatesOn(&v);
// Another thread
for(;;)
{
int g = v;
std::cout << g;
}
Предположим, что мнимая функция уровня ОС SetUpdatesOn
периодически меняет передаваемую ей переменную. Если переменная не объявлена как volatile, компилятор может оптимизировать вызов int g = v
или предположить, что v
всегда имеет одно и то же значение.
Если переменная объявлена как volatile, компилятор продолжит читать ее в l oop.
Обратите внимание, что очень часто такие ошибки программирования трудно отлаживать, поскольку оптимизация может существовать только в сборках выпуска.