Позволяет ли цикл C ++ 11 for новую или лучшую оптимизацию? - PullRequest
18 голосов
/ 13 октября 2010

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

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

}

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

Ответы [ 2 ]

21 голосов
/ 13 октября 2010

Это просто синтаксический сахар, поскольку стандарт говорит, что он эквивалентен циклу с итераторами [ 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 не тривиальны.

[ Edit :

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

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

5 голосов
/ 13 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...