C++11: Переборный цикл найдёт несуществующие объекты

Apr 19, 2014 11:09

Сегодня был шокирован.
Новый компилятор C++11 согласно стандарту имеет право выкидывать бесконечные циклы, если они без побочных эффектов.
Я так понял, цикл который проверяет существование объекта среди бесконечного множества - теперь является Undefined Behavior.
Например, поиск контрпримера к великой теореме Ферма. Или поиск строки, хеш от которой равен данному. И прочее переборное.

Иногда так бывает, что проверка существования может быть гораздо быстрее, чем нахождение конкретного примера.
Например, проверить что среди битов 64-битного int есть единичные - быстрее чем найти какой из них конкретный единичный.
Или можно проверить свойства бесконечного множества чисел кончающихся на 7 (т.е. по модулю 10), но не зная конкретного числа.
И поэтому может быть смысл разделить переборный механизм на две части - одна быстренько проверяет существование объекта, а вторая - уже пыхтит в поиске конкретного.

Значит, код вида
1) Распределим работу кусками по кластеру/по ядрам CPU, и посмотрим в каком классе натуральных чисел/строк есть нужный объект
2) А теперь найдём конкретный пример в этом куске
запросто будет сломан при переходе на C++11

Ссылки от archaicos ( из этого поста ):
Optimizing away a “while(1);” in C++0x
Is an (empty) infinite loop undefined behavior in C?
C Compilers Disprove Fermat’s Last Theorem
Compilers and Termination Revisited

c++

Previous post Next post
Up