Так если используется two's complement арифметика модульная арифметика является естественным результатом. Собственно в процессоре нет отдельных команд для знакового и беззнакового сложения. Разница есть только в интерпретации результата. Накладные расходы могут возникнуть только из-за того, что компилятор использовал UB для оптимизации как в примере выше.
Вот кусочек из пропосала:
> The main change between [P0907r0] and the subsequent revision is to maintain undefined behavior when signed integer overflow occurs, instead of defining wrapping behavior. This direction was motivated by:
> * Performance concerns, whereby defining the behavior prevents optimizers from assuming that overflow never occurs;
> * Implementation leeway for tools such as sanitizers;
> * Data from Google suggesting that over 90% of all overflow is a bug, and defining wrapping behavior would not have solved the bug.
честно говоря, я не знаток того, как арифметика реализована в процессоре, но есть
доклад с cppcon'а, где хорошо показано, что гарантии при переполнении беззнаковых типов заставляют компилятор генерировать менее оптимальный машинный код
насколько я понял из
доклада автора этого предложения, основной целью было запретить все остальные представления (дополнение до единицы и знаковый бит) как морально устаревшие. (смотрел давно и могу ошибаться)