Подтвердить что ты не робот

Preincrement быстрее, чем постинкремент в С++ - правда? Если да, то почему?

Возможный дубликат:
Есть ли разница в производительности между я ++ и ++ я на С++?

Я слышал о том, что preincrements (++ i) немного быстрее, чем postincrements (i ++) на С++. Это правда? И в чем причина этого?

4b9b3361

Ответ 1

Пост-инкремент обычно включает в себя сохранение копии предыдущего значения и добавление небольшого дополнительного кода. Pre-increment просто делает работу и убирается с пути. Я обычно pre-increment, если семантика не изменится, и поэтапное увеличение действительно необходимо.

Ответ 2

Постинъекты должны сделать копию объекта, чтобы вернуть неосвещенное значение. Для типов классов это может быть значительным, но для типов типа "int-like" (включая указатели), вероятно, это не так.

Ответ 3

Различие для типов простых типов, таких как int, возможно, незначительно. Я бы предположил, что компилятор способен оптимизировать такие случаи (например, при необходимости поправить постфикс в приращении префикса). Однако для сложных типов (как правило, итераторов STL разница может быть заметной). В этих случаях компилятор не может переключиться на префикс, потому что операторы могут делать совершенно разные вещи. Я рекомендую читать STL Iterators and Performance для получения некоторой справочной информации о снижении производительности при использовании пост-приращения для итераторов STL (рассказ: требуется дважды время как предварительное приращение).

Ответ 4

В любом достойном компиляторе ++ я и я ++ идентичны, если значение не используется.

Если это значение используется, ++ я потребуется временное сохранение значения предварительного приращения, если нужна идентичная семантика.

Ответ 5

на самом деле - это зависит. Postincrement нуждается в копировании, так как он сохраняет старое значение. Если тип incremented является сложным типом (например, итератором), а не простым типом, преинкремент быстрее, чем постинкремент. Это верно только в том случае, если вам не нужно значение до приращения.

Некоторые компиляторы могут даже обнаружить, что вам не нужен постинктер и оптимизировать копию - но, как всегда, это плохая привычка полагаться на это.