就读取POD /短C结构集合的L2缓存未命中而言,for (auto&& e : a)
比for (auto& e : a)
更有效,它在代码生成方面如何?
答案 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
可以绑定到左值引用,则两者是等价的。 e1
和e2
将在任何符合标准的编译器上推导出相同的左值引用类型,并且生成的代码应该相同。
但是,如果这样的绑定是不可能的(例如a
是vector<bool>
类型,最好。容器。永远。),那么e2
类型扣除将失败,并且仅e1
版本有效。
所以问题不在于哪一个更有效率。 auto& e
仅在auto&& e
有效的情况的子集中有效(后者在任何范围表达式有效的所有情况下都有效)。如果auto& e
有效,则它完全等同于auto&& e
。