Где в их документах реализации заявляют, что они не будут переупорядочивать функции черного ящика?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Где в их документах реализации заявляют, что они не будут переупорядочивать функции черного ящика?

Сообщение Anonymous »

Рассмотрим этот пример:

Код: Выделить всё

extern void black_box_foo();
extern void black_box_bar();
int main(){
black_box_foo();  // #1
black_box_bar();  // #2
}
и #2 — это функции, определения которых непрозрачны для реализаций, например, их определения находятся в статической библиотеке.
[intro.abstract] p1 говорит:

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

И наблюдаемое поведение перечислено в этом исчерпывающем списке ([intro.abstract] p8)

Следующее определяет наблюдаемое поведение программы:
  • Доступ через изменчивые значения glvalues оценивается строго в соответствии с правила абстрактной машины.
  • Данные доставляются в хост-среду для записи в файлы (см. также: ISO/IEC 9899:2024, 7.23.3).
  • Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы выходные данные фактически доставлялись до того, как программа ожидает ввода.
    То, что представляет собой интерактивное устройство, определяется реализацией.

Все приведенные выше правила можно сформулировать как правило «как если бы». Согласно этому правилу реализации могут переупорядочивать что угодно, если они обеспечивают, что переупорядочение не меняет наблюдаемое поведение.
Не видя определений функций, мы не можем знать, включают ли эти функции наблюдаемое поведение, указанное в приведенном выше списке. AFAIK, почти все основные реализации используют консервативный подход к функциям черного ящика: сохраняют порядок программы.
Есть два вопроса:
  • Могут ли соответствующие реализации исключить вызов функции, если эти функции были написаны на других языках, например, ассемблере, и сделать что-то, что не является наблюдаемым поведением с точки зрения определения C++? Если нет, то где соответствующие правила в документах реализаций?
  • Могут ли соответствующие реализации изменить порядок #1 и #2, если их определения непрозрачны? Если нет, то где соответствующие правила в документах реализации?
Обновление:
Есть еще некоторые аргументы относительно того, может ли реализация удалить std::this_thread::sleep_for(std::chrono::minites(10));, который не имеет наблюдаемого поведения, определенного в C++, даже несмотря на то, что это стандартная библиотека функция.
Как отметил Jarod42 в своем комментарии, с точки зрения стандарта C++, Sleep_for может быть удален.

Подробнее здесь: https://stackoverflow.com/questions/798 ... lack-box-f
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»