【问题标题】:Does a C++11 range-based for loop condition get evaluated every cycle?是否每个循环都会评估基于 C++11 范围的 for 循环条件?
【发布时间】:2013-03-23 20:38:30
【问题描述】:
for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime);

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

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

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

【问题讨论】:

    标签: c++ performance for-loop c++11 foreach


    【解决方案1】:

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

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

    其中range-init: 之后的表达式(用括号括起来)或花括号初始化列表

    【讨论】:

    • 差不多。 : 的右边是一个表达式,range-init 是括号中的那个表达式。 :)
    • @LightnessRacesinOrbit:确实。而且,如果有人关心为什么这很重要,“这可以确保顶级逗号运算符不能被重新解释为 __range 声明中的 init-declarators 之间的分隔符。”
    • range-init 被评估一次时,++__begin 将在每个循环中被评估,因此如果底层数据结构发生变化,在 range-init 被评估时不在底层数据结构中的值可能分配给for-range-declaration,包括由此产生的未定义行为(例如无效的迭代器)。只是澄清“评估一次”并不等同于当时安全生成的所有值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2011-12-17
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多