Es poco probable que la llamada al std::list<T>::end()
sea un gran problema de eficiencia y probablemente solo lea un valor único. Sin embargo, le daría al compilador una pista de que no debe cambiar al almacenarla como variable. Para otros contenedores, un cómputo puede estar involucrado además de leer una dirección base que es un poco más complicada. Todavía no hay nada espectacular, pero posiblemente valga la pena evitarlo.
Tenga en cuenta, sin embargo, que también puede cambiar la semántica del bucle: si el cuerpo del bucle puede agregar elementos, el anterior puede moverse. Curiosamente, no encuentro ningún requisito específico en la norma que indique si el std::list<T>::end()
puede cambiar al insertar elementos en el contenedor (puedo imaginar implementaciones en las que cambia así como en otras donde no, pero lo más probable es que no cambie). , aunque). Si desea obtener un comportamiento garantizado cuando también modifica la lista, puede llamar al list.end()
en cada iteración.
Por cierto, hay una mayor preocupación de rendimiento que tendría sobre el uso de iterator++
en lugar de ++iterator
, especialmente esto es lo que el autor utilizó en el libro. Aún así, se trata de una micro optimización, como almacenar el resultado de list.end()
, pero es una tarea barata.
' std :: list :: end' es el final de una lista enlazada con doble finalización, por lo que es debería ser una operación de tiempo constante. Dado que no se agrega mientras está en el bucle, un compilador de optimización debería poder almacenarlo en caché. – oldrinb
Esto sería en el ámbito de la "optimización prematura". Preocuparse demasiado pronto puede causar problemas, especialmente porque si agrega o elimina elementos a la lista dentro de su ciclo, el extremo puede cambiar. Si has aislado una parte específica de tu código (que se basa en esto) como un cerdo de CPU, entonces optimízate por todos los medios, pero de lo contrario hay peces más grandes en el mar. – Wug
@Wug Si sabe que '.end()' es un tiempo constante, sí (y sí, sé que debe estar en C++, para este contenedor específico). Pero para las listas que pueden ser muy largas y cuyo '.end()' es O (n), dicha optimización no es prematura en absoluto. – delnan