С++ 0x Накладные расходы Lambda
Есть ли какие-либо служебные данные, связанные с использованием лямбда-выражений в С++ 0x (под VS2010)?
Я знаю, что использование функциональных объектов несет служебные данные, но я имею в виду выражения, которые передаются, например, для алгоритмов STL. Компилятор оптимизирует выражение, устраняя то, что похоже на вызов функции? Я начал очень нравиться лямбда-выражениям, но меня немного беспокоит ограничение скорости.
Спасибо заранее!
Ответы
Ответ 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) );
}
Как и во всех объектах функций, накладные расходы очень минимальны, так как вызов может быть легко встроен.