我想知道C ++编译器是否会像现在为“正常”循环一样展开基于范围的循环以最大化性能,或者在某些情况下基于范围的循环会比正常循环慢?
非常感谢。
答案 0 :(得分:7)
相当于:
{
auto && __range = ( /expression/ );
for (auto __begin = begin(__range),
__end = end(__range);
__begin != __end;
++__begin) {
/declaration/ = *__begin;
/statement/
}
}
如果编译器知道迭代次数并且它可以解决循环依赖性或循环是独立的,那么编译器可以自由地展开。
通常,循环展开将仅针对较小的循环提高性能。因此,IMO,基于范围的循环是否展开并不重要。您当然可以使用-O3
和-funroll-loops
以及相关选项进行基准测试,看看两者之间是否存在任何差异。
答案 1 :(得分:5)
可能是编译器将基于范围的循环转换为它们的常规循环对应物,所以我希望它们是等价的。