Los hechos:
i ++ y ++ i son igualmente fáciles de leer. No te gusta uno porque no estás acostumbrado, pero esencialmente no hay nada que puedas malinterpretar, así que ya no es más trabajo leer o escribir.
En al menos algunos casos, el operador de postfix será menos eficiente.
Sin embargo, en el 99.99% de los casos, no importará porque (a) de todos modos actuará en un tipo simple o primitivo y solo es un problema si está copiando un objeto grande (b) no estará en un rendimiento parte crítica del código (c) no sabe si el compilador lo optimizará o no, puede que lo haga.
Por lo tanto, sugiero que usar prefijo a menos que necesite específicamente postfix es un buen hábito para entrar, solo porque (a) es un buen hábito para ser preciso con otras cosas y (b) una vez en una luna azul, tendrá la intención de usar postfix y dígalo al revés: si siempre escribe lo que quiere decir, es menos probable. Siempre hay una compensación entre rendimiento y optimización.
Debes usar tu sentido común y no micro-optimizar hasta que lo necesites, pero tampoco ser flagrantemente ineficiente por el simple hecho de hacerlo. Por lo general, esto significa: en primer lugar, descartar cualquier construcción de código que sea inaceptablemente ineficiente incluso en un código que no sea crítico para el tiempo (normalmente algo que representa un error conceptual fundamental, como pasar objetos de 500 MB por valor sin ningún motivo); y segundo, de cualquier otra forma de escribir el código, elija el más claro.
Sin embargo, creo que la respuesta es simple: creo que escribir un prefijo a menos que necesite específicamente postfix es (a) muy marginalmente más claro y (b) muy marginalmente más probable que sea más eficiente, por lo que siempre debe escribirlo de forma predeterminada, pero No te preocupes si lo olvidas.
Hace seis meses, pensé lo mismo que tú, que i ++ era más natural, pero es puramente a lo que estás acostumbrado.
EDITAR 1: Scott Meyers, en "C ++ más eficaz", en quien generalmente confío en esto, dice que en general debe evitar usar el operador postfix en tipos definidos por el usuario (porque la única implementación sensata de la función de incremento de postfix es hacer un copia del objeto, llame a la función de incremento de prefijo para realizar el incremento y devuelva la copia, pero las operaciones de copia pueden ser costosas).
Por lo tanto, no sabemos si existen reglas generales sobre (a) si eso es cierto hoy, (b) si también se aplica (menos) a los tipos intrínsecos (c) si debería usar "++" en nada más que una clase de iterador ligero. Pero por todas las razones que describí anteriormente, no importa, haga lo que dije antes.
EDIT 2: Esto se refiere a la práctica general. Si crees que sí importa en algún caso específico, entonces debes perfilarlo y verlo. Perfilar es fácil y barato y funciona. Deducir de los primeros principios lo que debe optimizarse es difícil y costoso y no funciona.
i++
antes de saber que podría afectar el rendimiento++i
, así que cambié. Al principio, este último parecía un poco extraño, pero después de un tiempo me acostumbré y ahora se siente tan natural comoi++
.