On https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html it is recommended to write for loops like the following:
Container::iterator end = large.end();
for (Container::iterator it = large.begin(); it != end; ++it) {
//...;
}
instead of
for (Container::iterator it = large.begin(); it != large.end(); ++it) {
//...;
}
Since I have rarely seen this style in any code, I would like to know whether the consecutive call of end() really adds a noticeable run-time overhead for large loops over stl containers or whether compilers already optimize such cases.
Edit:
As many of to very good comments pointed out: This question is only valid if the code inside the loop does not modify the end iterator. Otherwise of course the repeated call of end is mandatory.
The C++11 standard (§ 23.2.1) mandates that
endhas O(1) complexity, so a conforming implementation would have the same performance characteristics for both versions.That said, unless the compiler can prove that the return value of
endwill never change then pullingendout of the loop might be faster by some constant quantity (as Steve Jessop comments, there are lots of variables that can influence whether this is true or not).Still, even if in one particular case there is absolutely no performance difference, pulling such tests out of the loop is a good habit to get into. An even better habit to get into is to utilize standard algorithms as @pmr says, which sidesteps the issue entirely.