Es empfiehlt sich immer, die Prä-Dinger zu nutzen, da die Postinkremente und Postdekremente eine Kopie des Ursprungswerts liefern, die möglicher Weise, unter Umständen, noch gebraucht werden könnte. Aber selbst wenn ein guter Compiler sowas im Handumdrehen erledigen kann, ist diese "Mikrooptimierung" nichts was weh tut und verdeutlicht bloß umso mehr die Intention hinterm Code.
Im Übrigen ist solch eine compilerseitige Optimierung mit Builtin-Typen wie int noch ganz trivial. Nach unbenutzten Registern suchen und fertig ist die Lauge. Bei überladenen Operatoren sieht das schon anders aus, da C++ unglücklicher Weise erlaubt, Postkremente und Dekremente separat zu definieren. Es ist also - wenngleich das total bescheuert wäre - denkbar, dass für ein Objekt x nicht zwingend ++x das selbe x liefert wie x++, x. Und da der Compiler in aller Regel keine Lust hat, alle Operatoren durchzuinterpretieren, um sie auf Äquivalenz zu überprüfen, nimmt er gewöhnlich eine sinnlose Kopie des Objekts in Kauf.
Sprachen wie D haben es geschickter gelöst. Dort kann man nur die Präkremente überladen. Postkremente werden davon abgeleitet.