Определяется ли для цикла цикл С++ 11 для каждого цикла?

for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime);

Если memoryManager содержит 1000 элементов, вызывает ли memoryManager.getItems() вызов 1000 раз или только один в начале цикла?

Выполняет ли компилятор оптимизацию с -O2 (или -O3)?

(memoryManager.getItems() возвращает a std::vector<Entity*>&)

Ответ 1

Он оценивается только один раз. Стандарт определяет оператор на основе диапазона for как эквивалент:

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

где range-init - это выражение (окруженное скобками) или бит-init-list после :