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

С++ 0x Накладные расходы Lambda

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

Спасибо заранее!

4b9b3361

Ответ 1

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

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

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

Ответ 2

Под капотом

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) );
}

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