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