Preincrement быстрее, чем постинкремент в С++ - правда? Если да, то почему?
Возможный дубликат:
Есть ли разница в производительности между я ++ и ++ я на С++?
Я слышал о том, что preincrements (++ i) немного быстрее, чем postincrements (i ++) на С++. Это правда? И в чем причина этого?
Ответы
Ответ 1
Пост-инкремент обычно включает в себя сохранение копии предыдущего значения и добавление небольшого дополнительного кода. Pre-increment просто делает работу и убирается с пути. Я обычно pre-increment, если семантика не изменится, и поэтапное увеличение действительно необходимо.
Ответ 2
Постинъекты должны сделать копию объекта, чтобы вернуть неосвещенное значение. Для типов классов это может быть значительным, но для типов типа "int-like" (включая указатели), вероятно, это не так.
Ответ 3
Различие для типов простых типов, таких как int, возможно, незначительно. Я бы предположил, что компилятор способен оптимизировать такие случаи (например, при необходимости поправить постфикс в приращении префикса). Однако для сложных типов (как правило, итераторов STL разница может быть заметной). В этих случаях компилятор не может переключиться на префикс, потому что операторы могут делать совершенно разные вещи. Я рекомендую читать STL Iterators and Performance для получения некоторой справочной информации о снижении производительности при использовании пост-приращения для итераторов STL (рассказ: требуется дважды время как предварительное приращение).
Ответ 4
В любом достойном компиляторе ++ я и я ++ идентичны, если значение не используется.
Если это значение используется, ++ я потребуется временное сохранение значения предварительного приращения, если нужна идентичная семантика.
Ответ 5
на самом деле - это зависит. Postincrement нуждается в копировании, так как он сохраняет старое значение. Если тип incremented является сложным типом (например, итератором), а не простым типом, преинкремент быстрее, чем постинкремент.
Это верно только в том случае, если вам не нужно значение до приращения.
Некоторые компиляторы могут даже обнаружить, что вам не нужен постинктер и оптимизировать копию - но, как всегда, это плохая привычка полагаться на это.