TL; DR Компилятор может делать все, что ему захочется, при каждом энергозависимом доступе. Но документация должна вам сказать .-- «Семантика доступа через volatile glvalue определяется реализацией.»
Стандарт определяет для программы разрешенные последовательности «volatile access» и других«наблюдаемое поведение» (достигается с помощью «побочных эффектов»), которое реализация должна соблюдать в соответствии с «правилом« как будто »».
Но стандарт гласит (выделение жирным шрифтом):
Рабочий проект, стандарт для языка программирования C ++
Номер документа: N4659
Дата: 2017-03-21
§ 10.1. 7.1 Спецификаторы cv
5 Семантика доступа через энергозависимое glvalue определяется реализацией. […]
Аналогично для интерактивных устройств (мойвыделение жирным шрифтом):
§ 4.6 Выполнение программы
5 Соответствующая реализация, выполняющая правильно сформированную программу, должна производить то же наблюдаемое поведение, что и одно из возможных исполнений соответствующегоэкземпляр абстрактной машины с той же программой и тем же входом. [...]
7 Минимальные требования к соответствующей реализации:
(7.1) - Доступ через изменчивые значения вычисляется строго в соответствии с правилами абстрактной машины.
(7.2) - При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые могло бы дать выполнение программы в соответствии с абстрактной семантикой.
(7.3) - Динамика ввода и вывода в интерактивном режимеУстройства должны работать таким образом, чтобы вывод на самом деле доставлялся до того, как программа ожидает ввода. То, что составляет интерактивное устройство, определяется реализацией.
Все вместе они называются наблюдаемым поведением программы. [...]
(В любом случае какой конкретный код генерируется для программы не указан стандартом.)
Так что, хотя стандарт гласит, чтоизменчивый доступ не может быть исключен из абстрактных последовательностей побочных эффектов абстрактной машины и соответствующих наблюдаемых поведений, которые определяет некоторый код (возможно), вы не можете ожидать, что что-либо будет отражено в объектном коде или реальном поведении, если ваша документация компилятора не сообщитВы что представляет собой волатильный доступ . То же самое для интерактивных устройств.
Если вас интересует изменчивость в отношении абстрактных последовательностей побочных эффектов абстрактной машины и / или последующих наблюдаемых поведений, которые некоторый код (возможно) определяет , тогда скажи так . Но если вас интересует , какой соответствующий объектный код генерируется , вы должны интерпретировать это в контексте вашего компилятора и компиляции .
Хронически люди ошибочно полагают, что для изменчивых обращений оценка / чтение абстрактной машины вызывает реализованное чтение, а назначение / запись абстрактной машины вызывает реализованную запись. Нет никаких оснований для этого убеждения в отсутствие документации о реализации, говорящей об этом. Когда / iff реализация говорит, что на самом деле делает что-то при "изменчивом доступе", люди оправдывают ожидание того, что что-то--maybe, генерация определенного объектного кода.