2010-01-07 28 views
31

Duplicar posible:
Is there a performance difference between i++ and ++i in C++?Preincremento más rápido que poscreción en C++ - ¿cierto? Si es así, ¿por qué es?

oí sobre eso preincrements (++ i) son un poco más rápido que postincrements (i ++) en C++. ¿Es eso cierto? ¿Y cuál es el motivo de esto?

+0

Duplicados, duplicados y más duplicados: http://stackoverflow.com/search?q=[c%2B%2B]+i%2B%2B+%2B%2Bi – sth

+0

Qué plataforma de hardware. El preincremento y el postincremento originales donde las características de hardware del PDP-11. La velocidad era idéntica por la forma en que funcionaba la máquina. ¿Qué hardware específico se estaba utilizando? –

+0

Con los compiladores optimizadores actuales, no hay diferencia (me refiero a los tipos simples). La diferencia está en * indicando su intención * a cualquier persona que lea su código. –

Respuesta

48

El incremento posterior por lo general implica mantener una copia del valor anterior y agrega un pequeño código adicional. El pre-incremento simplemente hace su trabajo y se quita de en medio. Normalmente preincrecio a menos que la semántica cambie y el incremento posterior sea realmente necesario.

+1

Si esto es cierto para los tipos incorporados depende de cómo realmente usa el operador. Para los tipos definidos por el usuario, depende de cómo implemente el operador. –

+0

@Neil: debidamente calificado, ahora. – tvanfosson

8

Los postincrementos tienen que hacer una copia del objeto para devolver el valor no incrementado. Para los tipos de clase, esto podría ser significativo, pero para los tipos "int-like" (punteros incluidos), probablemente no lo sea.

1

en realidad - Depende. Postincrement necesita una copia ya que conserva el valor anterior. Si el tipo incrementado es un tipo complejo (por ejemplo, un iterador) y no un tipo simple, el preincremento es más rápido que el postincremento. Eso solo es cierto, por supuesto, si no necesita el valor antes del incremento.

Algunos compiladores incluso pueden detectar que no necesita un postincrement y optimizar la copia, pero como siempre, es una mala costumbre confiar en eso.

+0

No "como siempre" tanto como "en este caso". Si la legibilidad estaba en juego (como es común cuando se hacen preguntas sobre el rendimiento), es un mal hábito convertir su código en una pila de desorden inteligente. En este caso, sin embargo, es más o menos lo mismo. – Pablo

4

En cualquier compilador decente, ++ iy i ++ son idénticos si el valor no se utiliza.

Si se usa el valor, ++ necesitaría un valor temporal para almacenar el valor de preincremento si se deseara una semántica idéntica.

+10

Te refieres a i ++ en la segunda declaración allí. – Daemin

+0

No, no lo hice. Vuelve a leer mi respuesta. Sin embargo, signifiqué "pre-incremento" no "pre-incrementado". –

+0

La declaración es correcta. Él se está refiriendo al valor antes de que se incremente. – ohgodnotanotherone

7

La diferencia para tipos de tipos simples como int es probablemente despreciable. Yo diría que el compilador puede optimizar tales casos (por ejemplo, convertir un postfijo en un incremento de prefijo cuando corresponda). Sin embargo, para tipos complejos (típicamente iteradores STL, la diferencia puede ser notable). El compilador no puede cambiar al prefijo en estos casos porque los operadores realmente pueden hacer cosas totalmente diferentes. Recomiendo leer STL Iterators and Performance para obtener información de contexto sobre la penalización del rendimiento al usar el incremento posterior para los iteradores STL (cuento: lleva el doble de tiempo que el pre-incremento).

Cuestiones relacionadas