`for(auto&& e:a)`比(auto& e:a)`更有效?

时间:2015-04-10 20:14:47

标签: c++ c++11

就读取POD /短C结构集合的L2缓存未命中而言,for (auto&& e : a)for (auto& e : a)更有效,它在代码生成方面如何?

1 个答案:

答案 0 :(得分:8)

根据标准:

  

基于范围的for语句相当于:

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

因此for (auto&& e : a)for (auto& e : a)之间的差异缩小了差异:

auto&& e1 = *__begin;
auto& e2 = *__begin;

如果*__begin可以绑定到左值引用,则两者是等价的。 e1e2将在任何符合标准的编译器上推导出相同的左值引用类型,并且生成的代码应该相同。

但是,如果这样的绑定是不可能的(例如avector<bool>类型,最好。容器。永远。),那么e2类型扣除将失败,并且仅e1版本有效。

所以问题不在于哪一个更有效率。 auto& e仅在auto&& e有效的情况的子集中有效(后者在任何范围表达式有效的所有情况下都有效)。如果auto& e有效,则它完全等同于auto&& e