Оптимальная производительность будет достигнута, если есть способ сообщить компилятору, что в случае переполнения он может свободно выбирать среди всех возможных вариантов поведения , которые отвечают требованиям приложения. Рассмотрение переполнения, поскольку UB даст только оптимальное поведение, если программист может быть настолько уверен в том, что программа никогда не получит никаких входов, которые вызывают переполнение, что даже самое преднамеренно-капризное поведение переполнения, которое можно вообразить, будет соответствовать требованиям.
В случаях, когда было бы приемлемо, чтобы компилятор произвольно выбирал из множества возможных выходов, при условии, что общее поведение остается ограниченным, делая переполнение UB, вероятно, приведет к комбинации наихудшего из всех миров сложность исходного кода и производительность во время выполнения по сравнению с -fwrapv, поскольку программисту пришлось бы указать в исходном коде все операции, которые компилятор будет автоматически генерировать для -fwrapv. Производительность будет хуже того, что может быть достигнуто при использовании менее агрессивного оптимизатора, который был разработан вокруг идеи «получить произвольные данные, но сдержанное поведение», но gcc не предлагает таких параметров.
Перехват переполнения в компиляторе может быть намного дороже, чем перенос переполненных вычислений (или - если компилятор разрешает - пусть они рассматриваются как имеющие произвольную расширенную точность, которая может вести себя недетерминированным образом) но иногда может быть дешевле, чем перехватывание вручную в коде. Полезно ли переполнение захвата в компиляторе, зависит от того, требует ли его потребность в приложении.
"_Which быстрее? _" - Измерить его кодом. Я полагаю, это сильно зависит от приложения. –
Не нужно было проверять наличие переполнения. – user4581301
Ни один из них не предназначен для повышения производительности. Если вы используете их для производительности, вы делаете это неправильно. – hvd