Подтвердить что ты не робот

С++ 11 для цикла допускает новую или лучшую оптимизацию?

В С++ 11 теперь можно сделать:

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

}

Я знаю, что добавление и использование лямбда - это синтаксический сахар, но он предоставляет интересные возможности для оптимизации.

Как насчет цикла for? Является ли это только синтаксическим сахаром или может компилятор оптимизировать некоторые случаи, которые он не мог или будет слишком сложно сделать с рукописным циклом?

4b9b3361

Ответ 1

Это просто синтаксический сахар, поскольку стандарт говорит, что он эквивалентен циклу с итераторами [Edit: это означает, что он не предоставляет никакой дополнительной информации компилятору по сравнению с эквивалентом для цикла — end edit]. Вы можете получить лучшую производительность, хотя это эквивалентно:

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 не являются тривиальными.

[Изменить:

лямбда - синтаксический сахар

Не совсем. В отличие от цикла, он позволяет компилятору напрямую фиксировать базовый указатель стека-кадра, поскольку переменные, захваченные ссылкой, сохраняют одно адресное направление для каждого использования по сравнению с объектом функции ручной работы. — end edit]

Ответ 2

Может быть, но, вероятно, нет. Это устраняет возможное создание переменной index/counter, которая не будет использоваться. Это не требуется для нормального цикла, но это гораздо более вероятно, потому что это то, что некоторые люди привыкли делать.

Реально, вряд ли это будет иметь значение даже из этого. Мне, по крайней мере, трудно представить, что команда компилятора настолько утончена, что у них есть даже малейшее стремление к поддержке С++ 0x, которая еще не справилась с относительно тривиальной точкой обнаружения и устранения создания и увеличения индекса цикла, который никогда не использовался.