Как видно из названия,
Типичный ответ:
Правило, которое разрешает любые и все преобразования кода, которые не изменяют наблюдаемое поведение программы
Время от времени мы продолжаем получать поведения от определенных реализаций, которые приписываются этому правилу. Много раз неправильно. Итак, что же это за правило. Стандарт не содержит четкого упоминания об этом правиле в качестве раздела или абзаца, так что конкретно подпадает под действие этого правила? Мне кажется, что это серая зона, которая подробно не определена стандартом. Может кто-нибудь уточнить детали со ссылкой на ссылки из стандарта.
Примечание: пометьте это как C и C ++, потому что это относится к обоим языкам.
«как будто«Правило в основном определяет, какие преобразования разрешено выполнять реализации на легальной программе C ++. Короче говоря, все преобразования, которые не влияют на программу»наблюдаемое поведение«(см. ниже для точного определения).
Цель состоит в том, чтобы предоставить реализациям свободу выполнения оптимизаций, пока поведение программы остается совместимым с семантикой, определенной Стандартом C ++ в терминах абстрактной машины.
Стандарт C ++ 11 вводит «как будто«Правило в пункте 1.9 / 1:
Семантические описания в этом международном стандарте определяют параметризованный недетерминированный реферат
машина. Настоящий международный стандарт не предъявляет требований к структуре соответствующих реализаций.
В частности, им не нужно копировать или эмулировать структуру абстрактной машины. Скорее, соответствует
реализации должны эмулировать (только) наблюдаемое поведение абстрактной машины, как объяснено
ниже.
Также пояснительная сноска добавляет:
Это положение иногда называют правилом «как будто», потому что реализация свободна игнорировать любое требование этого
Международном стандарте до тех пор, пока результат будет соответствовать требованию, насколько это можно определить из
наблюдаемое поведение программы. Например, фактическая реализация не должна оценивать часть выражения, если она может
сделать вывод, что его значение не используется и что не возникает никаких побочных эффектов, влияющих на наблюдаемое поведение программы.
Пункт 1.9 / 5 дополнительно определяет:
Соответствующая реализация выполнение правильно сформированной программы должен производить то же наблюдаемое поведение
как одно из возможных исполнений соответствующего экземпляра абстрактной машины с той же программой
и тот же вход. Однако, если любое такое выполнение содержит неопределенную операцию, этот Международный
Стандарт не предъявляет никаких требований к реализации, выполняющей эту программу с этим вводом (даже не
в отношении операций, предшествующих первой неопределенной операции).
Стоит подчеркнуть, что это ограничение применяется, когда «Выполнение правильно сформированной программы» и что возможные результаты выполнения программы, которая содержит неопределенное поведение, являются неограниченными. Это также четко указано в пункте 1.9 / 4:
Некоторые другие операции описаны в этом международном стандарте как неопределенные (например, эффект
попытки изменить объект const). [ Заметка: Настоящий международный стандарт не предъявляет никаких требований к
поведение программ, которые содержат неопределенное поведение. —Конечная записка]
Наконец, относительно определения «наблюдаемое поведение«Пункт 1.9 / 8 гласит:
Минимальные требования к соответствующей реализации:
— Доступ к изменчивым объектам оценивается строго по правилам абстрактной машины.
— При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые
Выполнение программы в соответствии с абстрактной семантикой было бы произведено.— Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы
вывод на самом деле доставляется до того, как программа ожидает ввода. Что представляет собой интерактивное устройство
определяется реализацией.Все вместе называются наблюдаемым поведением программы. [ Заметка: Более строгий
соответствия между абстрактной и фактической семантикой могут быть определены каждой реализацией. —конец
нота ]
Насколько мне известно, единственное исключение из «как будто«Правило — это исключение копирования / перемещения, которое допускается, даже если у конструктора копирования, конструктора перемещения или деструктора класса есть побочные эффекты. Точные условия для этого указаны в пункте 12.8 / 31:
При соблюдении определенных критериев реализация может опустить конструкцию копирования / перемещения класса.
объект, даже если выбран конструктор для операции копирования / перемещения и / или деструктор для объекта
имеют побочные эффекты. […]
В C11 правило никогда не называется этим именем. Однако C, как и C ++, определяет поведение в терминах абстрактной машины. Правило «как будто» в C11 5.1.2.3p4 и p6:
В абстрактной машине все выражения оцениваются в соответствии с семантикой. Реальная реализация не должна оценивать часть выражения, если она может сделать вывод, что его значение не используется и что не возникает никаких побочных эффектов (включая любые, вызванные вызовом функции или доступом к энергозависимому объекту).
- […]
Минимальные требования к соответствующей реализации:
- Доступ к
volatile
объекты оцениваются строго по правилам абстрактной машины.- При завершении программы все данные, записанные в файлы, должны быть идентичны результату, который произойдет при выполнении программы в соответствии с абстрактной семантикой.
- Динамика ввода и вывода интерактивных устройств осуществляется в соответствии с 7.21.3. Цель этих требований заключается в том, чтобы небуферизованные или строковые буферизованные выходные данные появлялись как можно скорее, чтобы гарантировать, что подсказывающие сообщения действительно появляются до того, как программа ожидает ввода.
Это наблюдаемое поведение программы.