Компиляторам позволяют устранить бесконечные циклы?

Может оптимизация компилятора удалять бесконечные циклы, который не делает изменяет любые данные, как

while(1) 
  /* noop */;

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

Удаление бесконечных циклов запрещается стандартами C90/C99?

C90 или стандарты C99 разрешают компилятор к удалению таких циклов?

Upd: "Версия 6.0 Microsoft C сделала по существу эту оптимизацию". см. ссылку caf.

label: goto label;
return 0;

будет преобразован к

return 0;
30
задан Nietzche-jou 5 February 2010 в 03:36
поделиться

4 ответа

Это необходимость при написании демонов. Почему вы хотите назвать их мертвым кодом?

3
ответ дан 27 November 2019 в 23:57
поделиться

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

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

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

8
ответ дан 27 November 2019 в 23:57
поделиться

Думаю, вместо этого вы должны написать

C:\svn\bin>svn mkdir svn://localhost/myproject -m "some msg" --username user1 --password pass1 svn: 

, ваш пароль кажется неправильным.

-121--4780148-

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

  • Ваш первый игрок будет внешним ключом в таблице команд.
  • Ваш второй игрок будет внешним ключом в таблице компьютеров.

Если заменить «компьютер» в качестве игрока другой «командой», вы получите два внешних ключа в таблицу команд.

Мой JPA немного ржавый, но я полагаю, что вы моделируете отношения внешнего ключа с аннотацией @ OneToOne , например, так:

@OneToOne(cascade = {CascadeType.ALL}, optional = false)
@JoinColumn(name = "team1")

и второй с:

@OneToOne(cascade = {CascadeType.ALL}, optional = false)
@JoinColumn(name = "team2")
-121--3159647-

Нет пути обнаружить бесконечные циклы повсеместно: см. Остановка проблемы . Так что лучшее, что мог сделать любой компилятор, - это взять приличную догадку - например, очевидный случай, упомянутый в ОП.

Но почему это было бы желательно? Я мог видеть, излучая предупреждение и все еще разрешая поведение, но удалить цикл - это не «оптимизация» - это меняет поведение программы!

9
ответ дан 27 November 2019 в 23:57
поделиться

Это обсуждалось много раз ранее на COMP.LANG.C (например, здесь ) без, насколько я знаю, любой консенсус исход.

4
ответ дан 27 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: