Mar*_*tin 19 c++ performance containers stl
在https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html上,建议编写如下循环:
Container::iterator end = large.end();
for (Container::iterator it = large.begin(); it != end; ++it) {
//...;
}
Run Code Online (Sandbox Code Playgroud)
代替
for (Container::iterator it = large.begin(); it != large.end(); ++it) {
//...;
}
Run Code Online (Sandbox Code Playgroud)
由于我很少在任何代码中看到这种风格,我想知道end()的连续调用是否真的为stl容器上的大型循环添加了明显的运行时开销,或者编译器是否已经优化了这种情况.
编辑:许多非常好的评论指出:这个问题仅在循环内的代码不修改结束迭代器时才有效.否则,当然重复的结束呼叫是强制性的.
Jon*_*Jon 18
C++ 11标准(第23.2.1节)要求end具有O(1)复杂性,因此符合标准的实现对两个版本都具有相同的性能特征.
也就是说,除非编译器能够证明返回值end永远不会改变,否则拉出end循环可能会更快一些不变量(正如Steve Jessop评论的那样,有很多变量可以影响这是否真实) .
尽管如此,即使在一个特定情况下绝对没有性能差异,将这些测试拉出循环是一个很好的习惯.一个更好的习惯就是利用@pmr所说的标准算法,它完全回避了这个问题.
这不仅仅是end代价高昂,更多的是关于编译器看到end不会因循环体中的副作用而改变的能力(它是一个循环不变量).
end标准要求复杂性不变.见N3337中的表96 23.2.1.
使用标准库算法很好地避免了整个困境.
| 归档时间: |
|
| 查看次数: |
1619 次 |
| 最近记录: |