2010-01-07 12 views
31

Mögliche Duplizieren:
Is there a performance difference between i++ and ++i in C++?Preincrement schneller als posincrement in C++ - wahr? Wenn ja, warum?

hörte ich, dass preincrements (++ i) ein bisschen schneller als postincrements sind (i ++) in C++. Ist das wahr? Und was ist der Grund dafür?

+0

Duplikate, Duplikate und weitere Duplikate: http://stackoverflow.com/search?q=[c%2B%2B]+i%2B%2B+%2B%2Bi – sth

+0

Welche Hardwareplattform? Das ursprüngliche Pre-Increment und Pos-Increment waren die Hardwarefunktionen des PDP-11. Die Geschwindigkeit war identisch, weil die Maschine funktionierte. Welche spezielle Hardware wurde verwendet? –

+0

Mit heutigen Optimierung Compiler gibt es keinen Unterschied (für einfache Typen meine ich). Der Unterschied besteht darin, dass * Ihre Absicht * jedem angezeigt wird, der Ihren Code liest. –

Antwort

48

Beim Post-Inkrement wird normalerweise eine Kopie des vorherigen Werts beibehalten und ein wenig zusätzlicher Code hinzugefügt. Pre-Increment macht einfach seinen Job und kommt aus dem Weg. Normalerweise inkrementiere ich, bis sich die Semantik ändert und post-increment tatsächlich notwendig ist.

+1

Ob dies für die integrierten Typen gilt, hängt davon ab, wie Sie den Operator tatsächlich verwenden. Für die benutzerdefinierten Typen hängt es davon ab, wie Sie den Operator implementieren. –

+0

@Neil - richtig qualifiziert, jetzt. – tvanfosson

8

Postinkremente müssen eine Kopie des Objekts erstellen, um den nicht inkrementierten Wert zurückzugeben. Für Klassenarten könnte dies signifikant sein, aber für "int-like" Typen (inkl. Zeiger) ist es wahrscheinlich nicht.

1

tatsächlich - es kommt darauf an. Postincrement benötigt eine Kopie, da der alte Wert beibehalten wird. Wenn der inkrementierte Typ ein komplexer Typ (z. B. ein Iterator) und kein einfacher Typ ist, ist die Vorinkrementierung schneller als die Nachinkrementierung. Das gilt natürlich nur dann, wenn Sie den Wert vor dem Inkrement nicht benötigen.

Einige Compiler könnten sogar feststellen, dass Sie die Kopie weg kein Postinkrement brauchen und optimieren - aber wie immer - es ist eine schlechte Angewohnheit auf, dass zu verlassen.

+0

Nicht "wie immer" so viel wie "in diesem Fall". Wenn Lesbarkeit auf dem Spiel steht (wie es üblich ist, wenn Fragen zur Leistung gestellt werden), ist es eine schlechte Angewohnheit, Ihren Code in einen Stapel von cleverem Chaos zu verwandeln. In diesem Fall ist es jedoch ziemlich ähnlich. – Pablo

4

Auf jedem vernünftigen Compiler sind ++ i und i ++ identisch, wenn der Wert nicht verwendet wird.

Wenn der Wert verwendet wird, würde ++ ich eine temporäre benötigen, um den Pre-Inkrement-Wert zu speichern, wenn identische Semantik gewünscht wurde.

+10

Du meinst i ++ in der zweiten Aussage da. – Daemin

+0

Nein, habe ich nicht. Lies meine Antwort. Ich meinte jedoch "Vorinkrementieren" und nicht "Vorinkrementieren". –

+0

Die Aussage ist richtig. Er bezieht sich auf den Wert, bevor er erhöht wird. – ohgodnotanotherone

7

Der Unterschied für einfache Typen wie int ist wahrscheinlich vernachlässigbar. Ich würde annehmen, dass der Compiler in der Lage ist, solche Fälle zu optimieren (z. B. wenn ein Postfix in ein Präfix-Inkrement umgewandelt wird). Bei komplexen Typen (in der Regel STL-Iteratoren kann der Unterschied jedoch auffallen). Der Compiler kann in diesen Fällen nicht zum Präfix wechseln, da die Operatoren möglicherweise völlig unterschiedliche Dinge tun. Ich empfehle das Lesen STL Iterators and Performance für einige Hintergrundinformationen über die Leistungseinbußen bei der Verwendung von Post-Inkrement für STL-Iteratoren (Kurzgeschichte: es dauert doppelt so lange wie das Pre-Inkrement).

Verwandte Themen