Als memoryManager 1000 items bevat, wordt memoryManager.getItems()
dan 1000 keer aangeroepen of slechts één aan het begin van de lus?
Voert de compiler optimalisatie toe met -O2 (of -O3)?
(memoryManager.getItems()
retourneert een std::vector<Entity*>&
)
Antwoord 1, autoriteit 100%
Het wordt maar één keer geëvalueerd. De standaard definieert een op een bereik gebaseerde for
-instructie als equivalent aan:
{
auto && __range = range-init;
for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
for-range-declaration = *__begin;
statement
}
}
waarbij range-init
de uitdrukking is (tussen haakjes) of braced-init-list na de :