Сегодня был шокирован.
Новый компилятор C++11 согласно стандарту имеет право выкидывать бесконечные циклы, если они без побочных эффектов.
Я так понял, цикл который проверяет существование объекта среди бесконечного множества - теперь является Undefined Behavior.
Например, поиск контрпримера к великой теореме Ферма. Или поиск строки, хеш от которой равен данному. И прочее переборное.
Иногда так бывает, что проверка существования может быть гораздо быстрее, чем нахождение конкретного примера.
Например, проверить что среди битов 64-битного int есть единичные - быстрее чем найти какой из них конкретный единичный.
Или можно проверить свойства бесконечного множества чисел кончающихся на 7 (т.е. по модулю 10), но не зная конкретного числа.
И поэтому может быть смысл разделить переборный механизм на две части - одна быстренько проверяет существование объекта, а вторая - уже пыхтит в поиске конкретного.
Значит, код вида
1) Распределим работу кусками по кластеру/по ядрам CPU, и посмотрим в каком классе натуральных чисел/строк есть нужный объект
2) А теперь найдём конкретный пример в этом куске
запросто будет сломан при переходе на C++11
Ссылки от
archaicos (
из этого поста ):
Optimizing away a “while(1);” in C++0xIs an (empty) infinite loop undefined behavior in C?C Compilers Disprove Fermat’s Last TheoremCompilers and Termination Revisited