Der Compiler darf, wenn der Rückgabewert des Ausdrucks i++ nicht gebraucht wird (z.B. wenn es ein alleinstehender Ausdruck oder das letzte Argument einer for-Anweisung ist), i++ durch ++i ersetzen, wenn er ausschließen kann, das i++ nicht noch andere Seiteneffekte hat.
Das können gängige Compiler auf jeden Fall bei eingebauten Datentypen.
Bei Klassen (z.B. Iteratoren von manchen Containerklassen) geht das üblicherweise nicht, weil operator++() und operator++(int) überschrieben sind, und der Compiler nicht erkennen kann, ob er den einen einfach durch den anderen ersetzen darf.
Dann muss der Compiler bei i++ eine temporäre Variable anlegen, was je nach Typ recht aufwändig sein kann.
Darum sollte man sich angewöhnen, überall dort, wo man den Seiteneffekt des Postinkrements nicht braucht, Preinkrement zu benutzen.
Kurz:
Wenn es egal ist, nimm ++i. Kann nicht schaden, kann eventuell sogar nutzen.