Там какие-либо издержки связаны с использованием лямбда-выражений в C++ 0x (под VS2010)?
Я знаю, что использование функциональных объектов подвергается наверху, но я обращаюсь к выражениям, которые передаются алгоритмам STL, например. Компилятор оптимизирует выражение, устраняя то, что, кажется, появляется как вызов функции? Я начал действительно любить лямбда-выражения, но я немного обеспокоен штрафом скорости.
Заранее спасибо!
Вы «знаете», что объекты функций влекут за собой накладные расходы? Возможно, вам стоит перепроверить ваши факты. :)
Обычно использование алгоритма STL с функциональным объектом не требует дополнительных затрат по сравнению с циклом, созданным вручную. Наивный компилятор должен будет многократно вызывать operator ()
для функтора, но это тривиально для встраивания, и, по сути, накладные расходы равны нулю.
Лямбда-выражение - это не что иное, как синтаксический сахар для функционального объекта. Код преобразуется компилятором в функциональный объект, поэтому у него также отсутствуют накладные расходы.
Под капотом,
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) );
}
Как и в случае со всеми функциональными объектами, накладные расходы очень минимальны, так как вызов можно легко инклудить.