Есть много разных лиц Неопределенного Поведения, и то, что приемлемо, зависит от использования.
узкая внутренняя петля, которая потребляет большую часть общего процессорного времени в графическом приложении реального времени
Само по себе это немного необычно, но как бы то ни было ... если это действительно так, то UB, скорее всего, находится в пределах "допустимого, приемлемого" . Графическое программирование печально известно из-за хаков и безобразных вещей. Пока он «работает» и на его создание не уходит больше 16,6 мс, обычно это никого не волнует. Но все же, имейте в виду, что значит вызывать UB.
Во-первых, это стандарт. С этой точки зрения, нечего обсуждать, и нет способа оправдать, ваш код просто недействителен. Там нет ни «если», ни «когда», просто это не правильный код. С вашей точки зрения, вы могли бы также сказать, что это средний палец вверх, и в любом случае в 95-99% случаев вам будет хорошо.
Далее есть аппаратная сторона. Есть некоторые необычные, странные архитектуры, где это проблема. Я говорю «необычно, странно», потому что на одной архитектуре, которая составляет 80% всех компьютеров (или на двух архитектурах, которые вместе составляют 95% всех компьютеров), переполнение - это «да, все равно, все равно» вещь на аппаратном уровне. Вы уверены, что получите мусор (хотя все еще предсказуемый) результат, но ничего плохого не происходит.
Это нев случае с любой архитектурой вы вполне можете получить ловушку переполнения (хотя, если посмотреть на то, как вы говорите о графическом приложении, шансы оказаться на такой странной архитектуре довольно малы). Является ли переносимость проблемой? Если это так, вы можете воздержаться.
Наконец, есть сторона компилятора / оптимизатора. Одна из причин, по которой переполнение не определено, заключается в том, что просто оставить его таким, как когда-то, было легче всего справиться с оборудованием. Но другая причина заключается в том , что , например , x+1
будет гарантированно всегда быть больше x
, и компилятор / оптимизатор может использовать эти знания. Теперь, для ранее упомянутого случая, как известно, компиляторы действительно действуют таким образом и просто удаляют полные блоки (несколько лет назад существовал эксплойт Linux, который был основан на том, что компилятор удалил некоторый код проверки именно из-за этого).
В вашем случае я бы серьезно усомнился в том, что компилятор делает какие-то особые, странные оптимизации. Тем не менее, что вы знаете, что я знаю. Если есть сомнения, попробуйте, Если это работает, вам хорошо идти.
(И, наконец, есть, конечно, аудит кода, вам, возможно, придется потратить время на обсуждение этого вопроса с аудитором, если вам не повезло.)