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

memoryManager에 1000 개의 항목이 포함되어있는 경우 memoryManager.getItems()은 루프 시작 부분에서 1000 번 또는 하나만 호출합니까?C++ 11 범위 기반 루프 조건은 매주기마다 평가됩니까?

컴파일러에서 -O2 (또는 -O3)를 사용하여 최적화를 실행합니까?

( memoryManager.getItems() 리턴한다 std::vector<Entity*>&는)

답변

47

은 한 번만 평가된다.

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

거의 :

+1

후 (괄호로 둘러싸인) 식 또는 보강-INIT-목록은 다음과 등가로 표준은 다양한 기반 for 문을 정의한다. ':'의 오른쪽이 표현식이면,'range-init'은 괄호로 묶인 표현식입니다. :) –

+3

@ LightnessRacesinOrbit : 실제로. 그리고 그 이유가 누구인지 궁금해하는 경우, "이것은 최상위 쉼표 연산자가 '__range'선언에서 init-declarator 사이의 구분 기호로 재 해석 될 수 없음을 보장합니다." –

+1

'range-init'은 한번 eva 된 반면,'++ __ begin'은 각 루프에 대해 평가되므로 기본 데이터 구조가 바뀌면'range-init'이 처리 될 때 기본 데이터 구조에없는 값이 될 수 있습니다 (예를 들어 무효화 된 itertors)를 포함하여'for-range-declaration'에 할당됩니다. "evaulated once"가 그 당시 안전하게 생성 된 모든 값과 동일하지 않다는 것을 명확히하는 것. –

관련 문제