C++ 0x Лямбда наверху

Там какие-либо издержки связаны с использованием лямбда-выражений в C++ 0x (под VS2010)?
Я знаю, что использование функциональных объектов подвергается наверху, но я обращаюсь к выражениям, которые передаются алгоритмам STL, например. Компилятор оптимизирует выражение, устраняя то, что, кажется, появляется как вызов функции? Я начал действительно любить лямбда-выражения, но я немного обеспокоен штрафом скорости.

Заранее спасибо!

26
задан Gratian Lup 10 July 2010 в 10:38
поделиться

2 ответа

Вы «знаете», что объекты функций влекут за собой накладные расходы? Возможно, вам стоит перепроверить ваши факты. :)

Обычно использование алгоритма STL с функциональным объектом не требует дополнительных затрат по сравнению с циклом, созданным вручную. Наивный компилятор должен будет многократно вызывать operator () для функтора, но это тривиально для встраивания, и, по сути, накладные расходы равны нулю.

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

44
ответ дан 28 November 2019 в 06:39
поделиться

Под капотом,

void f(char delim)
{
  std::for_each( seq.begin()
               , seq.end()
               , [=](const T& obj){std::cout << obj << delim;} );
}

примерно переводится как

class __local_class_name {
  char __delim;
public:
  __local_class_name(char delim) : __delim(delim) {}
  void operator()(const T& obj) {std::cout << obj << __delim;}
};

void f(char delim)
{
  std::for_each( seq.begin()
               , seq.end()
               , __local_class_name(delim) );
}

Как и в случае со всеми функциональными объектами, накладные расходы очень минимальны, так как вызов можно легко инклудить.

18
ответ дан 28 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: