Sí, semánticamente se evaluará en cada ciclo. En algunos casos, compiladores pueden ser capaces de eliminar la condición del bucle automáticamente, pero no siempre. En particular:
void foo(const struct rect *r) {
for (int i = 0; i < r->width * r->height; i++) {
quux();
}
}
El compilador no será capaz de mover la multiplicación en este caso, en cuanto a todo lo que sabe quux()
modifica r
.
En general, generalmente solo las variables locales son elegibles para el levantamiento de expresiones de un bucle (¡suponiendo que nunca tome su dirección!). Si bien, bajo ciertas condiciones, los miembros de la estructura también pueden ser elegibles, hay muchas cosas que pueden hacer que el compilador suponga que todo en la memoria ha cambiado, por ejemplo, escribir en cualquier puntero o invocar prácticamente cualquier función. Por lo tanto, si utiliza usuarios no locales, es mejor asumir que la optimización no ocurrirá.
Dicho esto, en general, yo recomiendo única forma proactiva moviendo el código potencialmente costosa de la condición si, sea:
- no hace daño a la legibilidad de hacerlo
- Obviamente tendrá un muy long time (por ejemplo, acceso a la red)
- O aparece como un punto de acceso en el perfilado.
Perdóneme por la persona con una respuesta muy larga y pensada, pero esta respuesta me explicó todo de una manera clara y concisa. – Faken
Pero no olvide tomar en serio la sugerencia de bdonlan sobre el uso de variables locales para control de bucle: los lugareños facilitan las cosas para que los compiladores optimicen su visibilidad (esto también puede ayudar a la comprensión del lector, no solo a la optimización del compilador). –
No me disculparía si fuera tú. Esto le da a bdonlan una oportunidad decente de la insignia "populista", con 9 votos más (al momento de escribir) y si Lulu obtiene 8 :-) –