在C ++ 11中,我们现在可以做到:
void dosomething( std::vector<Thing>& things )
{
for( Thing& thing : things )
{
dofoo( thing );
wiizzz( thing );
tadaa( thing );
}
}
我知道lambda的添加和使用是语法糖,但它提供了有趣的优化机会。
for循环怎么样?它只是语法糖还是编译器可以优化某些情况,它不能或者用手写循环太难了?
答案 0 :(得分:21)
这只是一个语法糖,因为标准说它等同于带迭代器的循环[编辑:这意味着它与循环的等价物相比,它不会向编译器提供任何附加信息 - 结束编辑]。你可能会获得更好的表现,因为它相当于:
for(auto iter = con.begin(), end = con.end(); iter != end; ++iter)
{
auto& ref = *iter;
// ...
}
虽然大多数人可能会写:
for(auto iter = con.begin(); iter != con.end(); iter++)
{
// use *iter directly
// ...
}
如果con.end(),iter ++或* iter不是微不足道的话可能会更慢。
[编辑:
lambda是语法糖
不是真的。与for循环不同,它允许编译器直接捕获堆栈帧基指针,对于通过引用捕获的变量,与手工处理的函数对象相比,每次使用可以节省一个地址间接。 - 结束编辑]
答案 1 :(得分:5)
也许,但可能不是。它确实消除了可能创建的不会使用的索引/计数器变量。对于正常的for循环来说,这不是必需的,但它更有可能发生,因为它是一些人习惯做的事情。
实际上,即便如此,它也不太可能有任何区别。至少,我觉得很难想象一个编译器团队如此复杂以至于他们对支持C ++ 0x有一点点的愿望,它还没有处理相对微不足道的检测和消除创建和增加循环索引的点。从未使用过。