是否每个周期都会评估基于C++ 11范围的循环条件?

Vit*_*meo 53 c++ performance foreach for-loop c++11

for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime);
Run Code Online (Sandbox Code Playgroud)

如果memoryManager包含1000个项目,那么memoryManager.getItems()在循环开始时会调用1000次还是只调用一次?

编译器是否使用-O2(或-O3)运行任何优化?

(memoryManager.getItems()返回std::vector<Entity*>&)

Mik*_*our 53

它只评估一次.该标准将基于范围的for语句定义为等效于:

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

range-init表达式(括号括起)或者后面的braced-init-list在哪里:

  • @LightnessRacesinOrbit:的确如此.并且,如果有人关心为什么这很重要,"这确保了顶级逗号运算符不能被重新解释为`__range`声明中的init-declarators之间的分隔符." (3认同)