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

在C11中,我们现在可以做:

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

}

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

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

这只是一个句法糖,因为标准说它相当于一个循环与迭代器[编辑:这意味着它不提供任何额外的信息给编译器相比循环结束编辑的等价物]。您可能会获得更好的表现,因为它相当于:

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 is syntactic sugar

不是真的。与for循环不同,它允许编译器直接捕获堆栈帧基本指针,对于通过引用捕获的变量,与手工功能对象相比,每次使用时将保存一个地址间接。 – 结束编辑]

http://stackoverflow.com/questions/3925142/does-c11-for-loop-allow-new-or-better-optimizations

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C 11 for循环是否允许新的或更好的优化?