История изменений
Исправление hateyoufeel, (текущая версия) :
Там прикол в том, что даже уже при -O1 компилятор не делает отдельного итерирования j и вычисления j * 0x20000001, а преобразует сначала код в
Да-да. Вопрос в том, нахера он это делает-то. Потому что на производительность это не то чтобы сильно влияет. Как и написано в PDF по ссылке, оптимизации вокруг UB в основном достаточно бесполезны.
Если написать хотя бы
0x20000001L
, то значение long укладывается в допустимые рамки, и цикл остаётся.
И вот поэтому большая часть сишных и плюсовых проектов собираются с -fwrapv
. Потому что это UB проще выключить чем пытаться не отстрелить себе случайно член.
Исправление hateyoufeel, :
Там прикол в том, что даже уже при -O1 компилятор не делает отдельного итерирования j и вычисления j * 0x20000001, а преобразует сначала код в
Да-да. Вопрос в том, нахера он это делает-то. Потому что на производительность это не то чтобы сильно влияет.
Если написать хотя бы
0x20000001L
, то значение long укладывается в допустимые рамки, и цикл остаётся.
И вот поэтому большая часть сишных и плюсовых проектов собираются с -fwrapv
. Потому что это UB проще выключить чем пытаться не отстрелить себе случайно член.
Исходная версия hateyoufeel, :
Если написать хотя бы
0x20000001L
, то значение long укладывается в допустимые рамки, и цикл остаётся.
И вот поэтому большая часть сишных и плюсовых проектов собираются с -fwrapv
. Потому что это UB проще выключить чем пытаться не отстрелить себе случайно член.