在 C++0x(在 VS2010 下)中使用 lambda 表达式是否有任何开销?
我知道使用函数对象会产生开销,但我指的是例如传递给 STL 算法的表达式。编译器是否优化了表达式,消除了看起来像函数调用的东西?我开始非常喜欢 lambda 表达式,但我有点担心速度损失。
提前致谢!
在 C++0x(在 VS2010 下)中使用 lambda 表达式是否有任何开销?
我知道使用函数对象会产生开销,但我指的是例如传递给 STL 算法的表达式。编译器是否优化了表达式,消除了看起来像函数调用的东西?我开始非常喜欢 lambda 表达式,但我有点担心速度损失。
提前致谢!
您“知道”函数对象会产生开销吗?也许你应该重新检查你的事实。:)
与手动循环相比,对函数对象使用 STL 算法的开销通常为零。一个天真的编译器将不得不重复调用operator()
仿函数,但这对于内联来说是微不足道的,因此实际上开销为零。
lambda 表达式只不过是函数对象的语法糖。代码由编译器转换为函数对象,因此它也具有零开销。
在引擎盖下,
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) );
}
与所有函数对象一样,开销非常小,因为可以轻松内联调用。