Mi instructor una vez me dijo que no debería definir una variable dentro de un ciclo , pero honestamente todavía no entiendo por qué.
¿Cuáles son las desventajas de eso?
¿Podría alguien explicarme eso?
c++
programming-practices
performance
initialization
declarations
usuario3260672
fuente
fuente
const
menos que haya una razón para no hacerlo (un hábito de la programación funcional). O no los modificaré, y el optimizador debería detectar cuándo no son necesarios, o lo haré y he evitado un error grave. Cuando esos valores intermedios constantes son específicos de una iteración del bucle, eso significa declararlos dentro del bucle. Sin embargo, otro momento en el que necesita declarar variables fuera del ciclo es cuando se referirá a ellas fuera del ciclo; por ejemplo, los resultados que está almacenando.Respuestas:
No es un problema definir una variable dentro de un bucle. De hecho, es una buena práctica, ya que los identificadores deben limitarse al alcance más pequeño posible.
Lo que es malo es asignar una variable dentro de un bucle si también podría asignarla una vez antes de que se ejecute el bucle. Dependiendo de cuán complejo sea el lado derecho de la tarea, esto podría volverse bastante costoso e incluso podría dominar el tiempo de ejecución del ciclo. Si escribe un bucle que usa el mismo valor calculado en todas las iteraciones, definitivamente debe calcularlo por encima del bucle; eso es más importante que minimizar su alcance.
Para aclarar: siempre y cuando
compute()
siempre devuelva el mismo valor, estees más inteligente que esto:
fuente
1/1/1900
, la variable debe declararse y el valor debe asignarse antes del ciclo.Los tipos complejos tienen constructores y destructores no triviales.
Esos serán llamados al comienzo y al final del cuerpo del bucle (ya que se inicializa y queda fuera de alcance). Si la inicialización es costosa, ya que necesita asignar algo de memoria, entonces debe evitarse.
Sin embargo, para los tipos triviales no hay problema. La asignación y la desasignación en sí mismas solo suman y restan un valor del puntero de la pila. (que se optimizará)
fuente
Bueno, su consejo es un poco demasiado simple (eso es un eufemismo).
Seguirlo va desde una buena idea sobre a quién le importa y una mala idea hasta lo imposible .
Debe seguirlo siempre que reutilizarlo sea más barato que destruir lo viejo y crear uno nuevo.
Debes evitarlo como una cuestión de estilo cuando no importa para el rendimiento.
Usted realmente debe rechazar cuando se selecciona con peor rendimiento o la semántica equivocadas.
No puede seguirlo cuando el tipo utilizado no permite ni el intercambio, ni la asignación de movimiento ni la asignación de copia.
fuente
for (std::string s; std::cin >> s;) ...
y aún estar "afuera"