for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime);
如果memoryManager包含1000个项,那么 memoryManager.getItems()
被调用1000次还是只在循环开始时调用一次?编译器是否会在-O2(或-O3)下运行任何优化?
(
memoryManager.getItems()
返回一个std::vector<Entity*>&
)for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime);
如果memoryManager包含1000个项,那么 memoryManager.getItems()
被调用1000次还是只在循环开始时调用一次?memoryManager.getItems()
返回一个std::vector<Entity*>&
)这只会被评估一次。标准将基于范围的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
就是该表达式括在括号内的结果。 :) - Lightness Races in Orbit__range
时init-declarator之间的分隔符。” - Mike Seymourrange-init
被评估一次时,++__begin
将在每个循环中被评估,因此如果底层数据结构发生更改,则可能会将未在评估range-init
时存在于底层数据结构中的值分配给for-range-declaration
,包括导致未定义行为(例如,使迭代器失效)。只是澄清“评估一次”并不等同于在那个时间安全地生成所有值。 - Glenn Teitelbaum