C ++ 0x Lambda开销

时间:2010-07-10 10:38:32

标签: c++ visual-studio-2010 lambda c++11 visual-c++-2010

在C ++ 0x(在VS2010下)使用lambda表达式是否有任何开销? 我知道使用 function 对象会产生开销,但我指的是传递给STL算法的表达式。编译器是否优化了表达式,消除了看起来像函数调用的东西?我开始非常喜欢lambda表达式,但我有点担心速度惩罚。

提前致谢!

2 个答案:

答案 0 :(得分:44)

你“知道”函数对象会产生开销吗?也许你应该重新检查一下你的事实。 :)

与手动循环相比,将STL算法与函数对象一起使用通常只有零开销。一个天真的编译器必须在仿函数上重复调用operator(),但这对于内联来说是微不足道的,因此实际上,开销是零。

lambda表达式只不过是函数对象的语法糖。代码由编译器转换为函数对象,因此它也没有开销。

答案 1 :(得分:18)

引擎盖下,

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

与所有函数对象一样,开销非常小,因为可以很容易地内联调用。