Почему нельзя исключить бесконечный цикл?

Правило «как если бы» подпадает под следующие правила:

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

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

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

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

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

... Доступ к объекту, обозначенному изменчивым значением glvalue (3.10), изменение объекта, вызов функции ввода-вывода библиотеки или вызов функции, которая выполняет любую из этих операций, - все это побочные эффекты, которые представляют собой изменения в состоянии среда исполнения. ...

Но возьмем такую ​​программу:

while (1) { }
// or
for (;;) { }

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

xorl    %eax, %eax
retq

Неужели все это недетерминировано? Бесконечный цикл - это, по сути, метка, переходите к ней снова и снова и продолжайте, пока компьютер не выключится. Код не делает ничего интересного, никаких вычислений, никаких операций ввода-вывода и т. Д.

В коде ядра интересен бесконечный цикл. Но в коде пользовательского пространства бесконечный цикл обычно является признаком плохо написанной программы. Так в чем же изъян моей логики?


person user4714342    schedule 25.03.2015    source источник
comment
Если бы вы ждали на старой заброшенной автобусной остановке (для удовольствия), было бы удивительно, если бы автобус подъехал?   -  person user2864740    schedule 26.03.2015
comment
У вас вопрос, почему этого не сделано? или почему этого нельзя сделать? (или ни то, ни другое?)   -  person BlackVegetable    schedule 26.03.2015


Ответы (1)


Это может быть из-за [intro.multithread] / p27 (цитируется N4140; это p24 в N3337):

Реализация может предполагать, что любой поток в конечном итоге выполнит одно из следующих действий:

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

Пустые бесконечные циклы - это UB в C ++ 11 и новее.

person T.C.    schedule 25.03.2015
comment
Может, но не обязательно. - person rici; 26.03.2015