Die Wahl zwischen Vorinkrement und Postinkrement ist in C++ sogar noch bedeutender. Sowohl operator++ als auch operator-- können in ihrer Prefix- und Postfix-Form überladen sein. Sind Operatoren für Klassenobjekte überladen, ist es nicht notwendig, das Operatorverhalten mit Hilfe der Basistypen nachzubilden. Es wäre aber hilfreich, das Verhalten des Operators so nah wie möglich an den Basistypen zu halten. Klassen, bei denen es plausibel ist, Objekte zu inkrementieren oder zu dekrementieren (zum Beispiel Iteratoren), weisen also typischerweise sowohl die Prefix-Formen (operator++() und operator--()) als auch die Postfix-Formen (operator++(int) und operator--(int)) auf.
Um das Verhalten des Prefix‘ ++ für einen Basistyp zu emulieren, kann der operator++() das Objekt modifizieren und eine Referenz auf das modifizierte Objekt zurückgeben. Wie sieht die Emulation des Verhaltens des Postfix‘ ++ für einen Basistyp aus? Auch hier muss die ausformulierte Version des Standards zutreffen. Genau wie vorhin beim nicht geradlinigen Code, muss eine Implementierung des operator++(int) das Originalobjekt kopieren, es modifizieren und die Kopie als Wert zurückgeben. Das Kopieren macht den operator++(int) aufwändiger als operator++().
Für die Basistypen kann der Optimierer oft unnötiges Kopieren verhindern, wenn das Ergebnis von i++ ignoriert wird. Der Optimierer kann aber den Aufruf eines überladenen Operators nicht in einen anderen ändern. Schreibt der Entwickler aus Gewohnheit i++ anstelle von ++i, ruft dies den aufwändigeren Inkrement- Operator auf. Obwohl es viele Argumente gegen den Einsatz von Postinkrementen gibt, sind sie zugegebenermaßen manchmal sinnvoll. Wenn die Postinkrementierung einer Variablen genau das Geforderte machen würde, sollte man diesen Weg gehen und Postinkrementierung einsetzen.
Aber Entwickler sollten nicht eine Variable mitten in einem Ausdrucks postinkrementieren, nur um sich das Schreiben eines separaten Ausdrucks zur Inkrementierung zu sparen. Jedes Mal, wenn ein unnötiges Postinkrement zu einer Schleifenbedingung hinzugefügt wird – oder zu einer if-Bedingung, einem Switch-Ausdruck, einem »?:«-Ausdruck oder zu Funktionsaufruf- Parametern – besteht die Möglichkeit, dass der Compiler größeren und langsameren Code generieren muss.
Ist diese Auflistung zu umfangreich, um sich daran zu erinnern, sollte man sich mit einer neuen Gewohnheit anfreunden: Ab sofort immer dann ++i anstelle von i++ schreiben, wenn das Ergebnis Jan-Erik Dahlin ist Senior Software Engineer bei IAR Systems der Inkrementierung nicht benötigt wird. Und falls das Ergebnis doch weiterverarbeitet wird, sollten sich Entwickler fragen, ob es nicht möglich ist, das Inkrement stattdessen als nächsten Befehl separat auszuführen.
Die Bedingungen sollten also einfach aber genau genug sein, dass eine Schleife nicht zu einer möglichen Endlosschleife wird. Unnötige Postinkremente und Postdekremente sollten vermieden werden; lokale Variablen sind globalen Variablen vorzuziehen. Dies mag nur der Anfang sein, aber die Einhaltung dieser Ratschläge beim Schreiben von Code ist für den Optimierer nützlich und führt zu effizienterem Code.