2013-04-02 3 views
48
for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime); 

Se memoryManager contiene 1000 voci, memoryManager.getItems() viene chiamato 1000 volte o solo uno all'inizio del ciclo?Un ciclo basato su intervallo C++ 11 viene valutato ogni ciclo?

Il compilatore esegue un'ottimizzazione con -O2 (o -O3)?

(memoryManager.getItems() restituisce un std::vector<Entity*>&)

risposta

47

viene valutata solo una volta. Lo standard definisce una for economico range-based come equivalente a:

{ 
    auto && __range = range-init; 
    for (auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin) { 
     for-range-declaration = *__begin; 
     statement 
    } 
} 

dove range-init è l'espressione (circondato da parentesi) o rinforzato-init-list dopo il :

+1

Quasi. Dove right of the ':' è un'espressione, 'range-init' è quell'espressione racchiusa tra parentesi. :) –

+3

@LightnessRacesinOrbit: Infatti. E, nel caso che a qualcuno importi perché questo è importante, "questo garantisce che un operatore virgola di primo livello non possa essere reinterpretato come delimitatore tra init-dichiarators nella dichiarazione di __range'." –

+1

mentre 'range-init' viene evocato una volta,' ++ __ begin' verrà valutato ogni ciclo in modo che se la struttura dei dati sottostante viene modificata, i valori che non erano nella struttura dati sottostante quando 'range-init' è stato valutato possono essere assegnato alla 'for-range-declaration', compreso il comportamento non definito risultante (ad es. itertori invalidati). Basta chiarire che "evaulato una volta" non equivale a tutti i valori generati in modo sicuro in quel momento. –