Почему бесконечный цикл не может быть устранен?
Правило "как будто" подпадает под следующие правила:
Минимальные требования к соответствующей реализации:
Доступ к изменчивым объектам оценивается строго по правилам абстрактной машины.
При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые могло бы дать выполнение программы в соответствии с абстрактной семантикой.
Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы вывод запроса фактически доставлялся до того, как программа ожидает ввода. То, что составляет интерактивное устройство, определяется реализацией.
Все вместе они называются наблюдаемым поведением программы.
... Доступ к объекту, обозначенному изменчивым значением glvalue (3.10), изменение объекта, вызов функции библиотечного ввода-вывода или вызов функции, выполняющей любую из этих операций, являются побочными эффектами, которые являются изменениями в состоянии среда исполнения....
Но давайте возьмем программу, подобную следующей:
while (1) { }
// or
for (;;) { }
Дело в том, что нет никаких объектов или вызовов функций и, следовательно, нет побочных эффектов и, следовательно, нет "изменений в состоянии среды выполнения". Что мешает компилятору компилировать этот код в
xorl %eax, %eax
retq
Это все так недетерминировано? По сути, бесконечный цикл - это "Вот ярлык, переходите к нему снова и снова" и будет продолжаться до тех пор, пока компьютер не выключится. Код не делает ничего интересного, никаких вычислений, ввода-вывода и т. Д.
В коде ядра бесконечный цикл становится интересным. Но в коде пользовательского пространства бесконечный цикл обычно является признаком плохо написанной программы. Так в чем недостаток моей логики?
1 ответ
Это может из-за [intro.multithread]/p27 (цитируя N4140; это p24 в N3337):
Реализация может предполагать, что любой поток в конечном итоге выполнит одно из следующих действий:
- прекратить,
- сделать вызов функции ввода-вывода библиотеки,
- получить доступ или изменить изменчивый объект, или
- выполнить операцию синхронизации или атомарную операцию.
Пустые бесконечные циклы - UB в C++11 и позже.