C ++ 11 for循环是否允许新的或更好的优化?

时间:2010-10-13 15:07:59

标签: c++ optimization for-loop c++11

在C ++ 11中,我们现在可以做到:

void dosomething( std::vector<Thing>& things )
{
    for( Thing& thing : things )
    {
        dofoo( thing );
        wiizzz( thing );
        tadaa( thing );
    }

}

我知道lambda的添加和使用是语法糖,但它提供了有趣的优化机会。

for循环怎么样?它只是语法糖还是编译器可以优化某些情况,它不能或者用手写循环太难了?

2 个答案:

答案 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有一点点的愿望,它还没有处理相对微不足道的检测和消除创建和增加循环索引的点。从未使用过。