Я знаю, что есть много вопросов о volatile
но я думаю, что задаю другой вопрос. Я не спрашиваю, что она делает (в целом), на мой вопрос: имеет ли volatile
ключевое слово ТОЛЬКО предотвратить компилятор от оптимизации кода, который использует летучий переменную или что - нибудь еще, что это ключевое слово делает?
Оставьте компилятор. Компилятор является наименее интересным аспектом C++ и обычно не играет роли в том, как вы думаете об этом языке.
Язык говорит об volatile
:
1.9, 1 парафраз:
Доступ к неустойчивым объектам оценивается строго в соответствии с правилами абстрактной машины.
...
Доступ к объекту, обозначенному
volatile
glvalue, является побочным эффектом, который является изменением состояния среды выполнения....
Реализация может предполагать, что любой поток в конечном итоге сделает одно из следующего:
- ...
- доступ или изменение изменчивого объекта
- ...
Итак, как вы можете видеть, volatile
объекты в некотором смысле являются частью интерфейса вашей программы с внешним миром. Одним из следствий является то, что волатильный доступ получает определенные гарантии заказа, но это только деталь. Большая картина заключается в том, что volatile
средства "могут взаимодействовать с окружающей средой".
volatile
определяется реализацией.
Доступ к памяти (чтение и запись) с volatile
переменными гарантируется в порядке, указанном в программе. Это все, действительно. Это означает, что компилятору не разрешено изменять порядок их работы (отключая определенные оптимизации компилятора), но также необходимо выпустить дополнительные инструкции, чтобы предотвратить переупорядочение ЦП.
Обратите внимание, что это не помешает переупорядочению всех non- volatile
папок вокруг volatile
. Это только гарантирует, что доступ к volatile
памяти не будет переупорядочен по отношению друг к другу (и что они не будут полностью оптимизированы)
volatile
то, что он делает, было подробно рассмотрено вчера только в stackoverflow.com/questions/26307071/… .volatile
.