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

Kla*_*aim 18 c++ optimization for-loop c++11

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

ybu*_*ill 21

它只是一个语法糖,因为标准说它相当于一个带迭代器的循环[ 编辑:这意味着它不会为编译器提供任何额外的信息,而不是循环结束编辑 ].你可能会获得更好的表现,因为它相当于:

for(auto iter = con.begin(), end = con.end(); iter != end; ++iter)
{
    auto& ref = *iter;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

虽然大多数人可能会写:

for(auto iter = con.begin(); iter != con.end(); iter++)
{
    // use *iter directly
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果con.end(),iter ++或*iter不是微不足道的话可能会更慢.

[ 编辑:

lambda是语法糖

并不是的.与for循环不同,它允许编译器直接捕获堆栈帧基指针,对于通过引用捕获的变量,与手工处理的函数对象相比,每次使用可以节省一个地址间接.- 结束编辑 ]

  • @Motti:标准明确表示它等同于上面的代码(嗯,有点复杂,因为它的语法是用范围表示的).无论如何,如果你的容器没有使迭代器失效,那么end()不会失效.所以有什么问题?只要不破坏此代码,就可以更改容器. (3认同)

Jer*_*fin 5

也许,但可能不是.它确实消除了可能创建的不会使用的索引/计数器变量.对于正常的for循环来说,这也不是必需的,但它更有可能发生,因为它是一些人习惯做的事情.

实际上,即便如此,它也不太可能产生任何影响.至少,我觉得很难想象一个编译器团队如此复杂以至于他们对支持C++ 0x有一点点的渴望,这还没有处理检测和消除创建和增加循环索引的相对微不足道的观点.没用过.