Код: Выделить всё
extern void black_box_foo();
extern void black_box_bar();
int main(){
black_box_foo(); // #1
black_box_bar(); // #2
}
Код: Выделить всё
#1[intro.abstract] p1 говорит:
В частности, им не обязательно копировать или эмулировать структуру абстрактной машины. Скорее, соответствующие реализации необходимы для эмуляции (только) наблюдаемое поведение абстрактной машины, как описано ниже.
И наблюдаемое поведение перечислено в этом исчерпывающем списке ([intro.abstract] p8)
Следующее определяет наблюдаемое поведение программы:
- Доступ через изменчивые значения glvalues оценивается строго в соответствии с правила абстрактной машины.
- Данные доставляются в хост-среду для записи в файлы (см. также: ISO/IEC 9899:2024, 7.23.3).
- Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы выходные данные фактически доставлялись до того, как программа ожидает ввода.
То, что представляет собой интерактивное устройство, определяется реализацией.
Все приведенные выше правила можно сформулировать как правило «как если бы». Согласно этому правилу реализации могут переупорядочивать что угодно, если они обеспечивают, что переупорядочение не меняет наблюдаемое поведение.
Не видя определений функций, мы не можем знать, включают ли эти функции наблюдаемое поведение, указанное в приведенном выше списке. AFAIK, почти все основные реализации используют консервативный подход к функциям черного ящика: сохраняют порядок программы.
Есть два вопроса:
- Могут ли соответствующие реализации исключить вызов функции, если эти функции были написаны на других языках, например, ассемблере, и сделать что-то, что не является наблюдаемым поведением с точки зрения определения C++? Если нет, то где соответствующие правила в документах реализаций?
- Могут ли соответствующие реализации изменить порядок #1 и #2, если их определения непрозрачны? Если нет, то где соответствующие правила в документах реализации?
Подробнее здесь: https://stackoverflow.com/questions/798 ... lack-box-f
Мобильная версия