Что же такое правило" как если бы"?



Как говорится в названии,




Что такое правило" как если бы"?




типичный ответ, который можно было бы получить:




правило, которое позволяет любые и все преобразования кода, которые не изменяют наблюдаемое поведение программы




время от времени мы продолжаем получать поведение от определенных реализаций, которые приписываются этому правилу. Много раз неправильно. Итак,что же это за правило. В стандарте это правило четко не упоминается как раздел или абзац, так что же именно подпадает под сферу действия этого правила? Мне кажется, что это серая область, которая не определена подробно стандартом. Может кто-то уточнить детали, ссылаясь на ссылки из стандарта.



Примечание: помечая это как C и C++ оба, потому что это относится к обоим языкам.

503   2  

2 ответов:

что такое ", а если" правила?

", а если" правило в основном определяет, какие преобразования реализация может выполнять на легальной программе C++. Короче говоря, все преобразования, которые не влияют на программу"наблюдаемого поведения" (см. ниже для точного определения) запрещены.

цель состоит в том, чтобы дать реализации свободу для выполнения оптимизации до тех пор, как поведение программы остается совместимым с семантикой, заданной стандартом C++ в терминах абстрактной машины.


где стандарт вводит это правило?

стандарт C++11 вводит ", а если" правила в пункте 1.9/1:

семантические описания в этом международном стандарте определяют параметризованный недетерминированный абстракт машина. Этот международный стандарт не накладывает никаких требований на структура соответствующих реализаций. В частности, им не нужно копировать или эмулировать структуру абстрактной машины. Скорее, соответствие реализации необходимы для эмуляции (только)наблюдаемого поведения абстрактной машины, как описано под.

кроме того, пояснительная сноска добавляет:

это положение иногда называют правилом "как если бы", потому что реализация может игнорировать любые требование этого Международный стандарт покуда результат как если бы требование было исполнено, насколько можно определить от наблюдаемое поведение программы. Например, фактическая реализация не должна оценивать часть выражения, если она может выведите, что его значение не используется и что никакие побочные эффекты, влияющие на наблюдаемое поведение программы не производятся.


что означает мандат правила точно?

в пункте 1.9 / 5 далее уточняется:

соответствующая реализация выполнение хорошо сформированной программы произведет такое же наблюдаемое поведение как одно из возможных исполнений соответствующего экземпляра абстрактной машины с той же программой и тот же вход. Однако, если какое-либо такое выполнение содержит неопределенную операцию, этот международный Стандарт не накладывает никаких требований на реализация выполнение этой программы с этим вводом (даже не в отношении операций, предшествующих первой неопределенной операции).

стоит отметить, что это ограничение применяется, когда "выполнение хорошо сформированной программы" только и что возможные результаты выполнения программы, которая содержит неопределенное поведение непринужденны. Это также четко указано в пункте 1.9 / 4:

некоторые другие операции описанный в этом международном стандарте как неопределенный (например, эффект попытки изменить объект const). [ Примечание:настоящий международный стандарт не предъявляет никаких требований к поведение программ, содержащих неопределенное поведение. -конец Примечание ]

наконец, относительно определения "наблюдаемого поведения", пункт 1.9 / 8 гласит следующее:

наименьшие требования к соответствующей реализации являются:

- доступ к летучим объектам оценивается строго по правилам абстрактной машины.

- при закрытии программы, все данные, записанные в файлах должны быть идентичны одному из возможных результатов выполнение программы в соответствии с абстрактной семантикой произвело бы.

- динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы выход на самом деле поставляется до того, как программа ожидает ввода. Что представляет собой интерактивное устройство определяется реализацией.

они в совокупности называются наблюдаемым поведением программы. [ Примечание: более жесткие соответствие между абстрактной и фактической семантикой может быть определено каждой реализацией. - конец Примечание]


есть ли ситуации, когда это правило не работает подать заявление?

насколько мне известно, единственное исключение из ", а если" правило-это копирование / перемещение elision, которое разрешено, даже если конструктор копирования, конструктор перемещения или деструктор класса имеют побочные эффекты. Точные условия для этого указаны в пункте 12.8 / 31:

при выполнении определенных критериев реализация может опустить конструкцию копирования / перемещения класса объект, даже если конструктор выбран для операции копирования / перемещения и / или деструктора объекта есть побочные эффекты. [...]

в C11 правило никогда не называется этим именем. Однако C, как и C++, определяет поведение в терминах абстрактной машины. Как-если правило C11 5.1.2. 3p4 и p6:

  1. в абстрактной машине все выражения вычисляются в соответствии с семантикой. фактическая реализация не должна оценивать часть выражения, если она может вывести, что ее значение не используется и что никакие необходимые побочные эффекты не производятся (в том числе любой вызванный вызовом функции или доступом к изменчивому объекту).

  2. [...]

  3. наименьшие требования к соответствующей реализации:

    • обращается к volatile объекты оцениваются строго по правилам абстрактной машины.
    • при завершении программы все данные, записанные в файлы, должны быть идентичны результату выполнения программы в соответствии с абстрактная семантика произвела бы.
    • динамика ввода и вывода интерактивных устройств должна быть такой, как указано в 7.21.3. Цель этих требований заключается в том, чтобы как можно скорее выводить данные без буферизации или линейной буферизации, чтобы гарантировать, что сообщения с запросами действительно появляются до того, как программа ожидает ввода.

    это наблюдаемое поведение программы.

Comments

    Ничего не найдено.