Я слышал, что компиляторы очень умны и знают, как оптимизировать операторы if/else.Что такое эксплуатационная стоимость тройного оператора
Я также слышал, что тройники отличаются высокой производительностью, потому что они меньше пропускают конвейер команд процессора.
Позвольте мне пояснить, на основании того, что я слышал:
An если/другое должно пройти его состояние через трубопровод и ждать результата, прежде чем он может выполнить расчеты для результата.
Однако троица может передавать вычисления исхода к процессору, не дожидаясь, пока булевское выражение пройдет через конвейер.
Итак, что быстрее, тройники или если/еще?
Это зависит от компилятора. Некоторые наивные, не оптимизирующие компиляторы могут, предположительно, использовать условные перемещения для тернар и ветвей для 'if/else', но любая разница между ними стирается во время более сложного преобразования SSA трансформатора. –
По крайней мере, в C семантика '?:' Запрещает оценку невыделенной стороны так же, как 'if() else'. Компилятор может оценивать оба пути выполнения тогда и только тогда, когда он соответствует правилу as-if, т.е. е. компилятор может доказать, что дополнительное вычисление не вызывает каких-либо наблюдаемых побочных эффектов. Опять же, это точно такая же ситуация для '?:' И 'if() else'. – cmaster
@IwillnotexistIdonotexist Наивный, не оптимизирующий компилятор не сможет доказать, что ему разрешено оценивать оба пути. Поэтому он должен скомпилировать '?:' Без условного перемещения. Только умные компиляторы могут доказать такие вещи и использовать условное движение здесь. – cmaster