我想知道使用下面的代码是否会对性能产生任何影响
与往常一样,在性能方面,您应该通过测量来支持您的假设。
除了明确的测量表明您在该特定例程中存在瓶颈之外,没有其他证据可以成为放弃更清晰、更简单的设计而转而采用更复杂、更不直观的设计的理由。根据定义,这将是过早的优化。
因此,请选择最能为您传达其意图的形式。这就是说,我可以回答以下问题:
get_elements()
每次迭代都会被调用还是只调用一次?
不,它只会被调用一次。C++11 标准的第 6.5.4/1 段规定了这种行为:
对于形式的基于范围的 for 语句
for ( for-range-declaration : expression ) statement
letrange-init
等价于括号括起来的表达式
( expression )
[...] 基于范围的 for 语句等效于
{
auto && __range = range-init; // <== HERE IS YOUR get_elements()!
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
关于你的第二个问题:
此外,传统的 for 循环怎么样?
这些只是不太清楚循环本身的目的,而且更容易出错。我建议避免手动循环。
例如,仅通过查看它的第一行,就可以明显看出基于范围的for
循环的目的是遍历集合的所有元素。
对于手动展开的for
循环,同样的情况并不明显,仅通过查看第一行,您不知道i
变量是否会在循环内增加或操作。
Herb Sutter在这篇文章中很好地讨论了这一点(参见问题 2-a 的解决方案)。