C ++ 0x Lambda накладные расходы - PullRequest
26 голосов
/ 10 июля 2010

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

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

Ответы [ 2 ]

44 голосов
/ 10 июля 2010

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

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

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

18 голосов
/ 10 июля 2010

Под капотом

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

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

...