Is the ranged based for loop beneficial to performance?

c++, c++11, for-loop, foreach, performance

Solution

The Standard is your friend, see [stmt.ranged]/1

For a range-based for statement of the form

for ( for-range-declaration : expression ) statement

let range-init be equivalent to the expression surrounded by parentheses

( expression )

and for a range-based for statement of the form

for ( for-range-declaration : braced-init-list ) statement

let range-init be equivalent to the braced-init-list. In each case, a range-based `for` statement is equivalent to

{
  auto && __range = range-init;
  for ( auto __begin = begin-expr,
             __end = end-expr;
        __begin != __end;
        ++__begin )
  {
    for-range-declaration = *__begin;
    statement
  }
}

So yes, the Standard guarantees that the best possible form is achieved.

And for a number of containers, such as `vector`, it is undefined behavior to modify (insert/erase) them during this iteration.

Problem

Reading various questions here on Stack Overflow about C++ iterators and performance**, I started wondering if `for(auto& elem : container)` gets "expanded" by the compiler into the best possible version? (Kind of like `auto`, which the compiler infers into the right type right away and is therefore never slower and sometimes faster). ** For example, does it matter if you write ``` for(iterator it = container.begin(), eit = container.end(); it != eit; ++it) ``` or ``` for(iterator it = container.begin(); it != container.end(); ++it) ``` for non-invalidating containers?

Original source