Прочитайте стандарт, прежде чем неправильно цитировать или понижать голос. Вот цитата из n2798:
7.1.6.1 Cv-квалификаторы
7 Примечание: volatile - это подсказка для реализации, чтобы избежать агрессивной оптимизации, связанной с объектом, поскольку значение объекта может быть изменено средствами, которые не могут быть обнаружены реализацией. См. 1.9 для подробной семантики. В общем, семантика volatile должна быть такой же в C ++, как и в C.
Ключевое слово volatile
действует как подсказка. Очень похоже на ключевое слово register
. Однако volatile
просит компилятор держать все свои оптимизации в страхе. Таким образом, он не будет хранить копию переменной в регистре или кэше (для оптимизации скорости доступа), а будет извлекать ее из памяти каждый раз, когда вы запрашиваете ее.
Поскольку путаницы так много, еще немного. Стандарт C99 фактически говорит о том, что изменяемый квалифицированный объект должен проверяться каждый раз, когда он читается, и так далее, как отметили другие. Но есть и другой раздел, в котором говорится, что то, что составляет изменчивый доступ, определяется реализацией. Таким образом, компилятор, который знает аппаратное обеспечение наизнанку, будет знать, например, когда у вас есть автоматически изменяемая квалифицированная переменная и адрес которой никогда не берется, что она не будет помещена в чувствительную область памяти и почти наверняка проигнорирует намек и оптимизировать его.
Это ключевое слово используется в типах обработки ошибок setjmp
и longjmp
. Единственное, что вы должны иметь в виду: вы задаете ключевое слово volatile, когда думаете, что переменная может измениться. То есть вы можете взять обычный объект и управлять им несколькими кастами.
Еще одна вещь, которую нужно иметь в виду, это определение того, что представляет собой изменчивый доступ, оставленный стандартом для реализации.
Если вы действительно хотели другую сборку сборки с оптимизацией