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

Duc*_*een 1 c++ c++11

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

Bar*_*rry 8

根据标准:

基于范围的for陈述相当于:

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

所以差异for (auto&& e : a)for (auto& e : a)减少差异:

auto&& e1 = *__begin;
auto& e2 = *__begin;
Run Code Online (Sandbox Code Playgroud)

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

但是,如果这样的绑定是不可能的(例如a,类型vector<bool>为Best.Container.永远.),那么e2类型推断将失败,并且只有e1版本才有效.

所以这不是一个更高效的问题.auto& e仅在有效的案例子集中auto&& e有效(后者在任何范围表达式有效的所有情况下都有效).如果auto& e有效,那么它完全等同于auto&& e.

  • 我反对:`vector <bool>`显然不是一个容器.它看起来像一个!(这是一个关于标准缺陷的笑话) (2认同)