C++ 0x Lambda开销

Gra*_*Lup 26 c++ lambda visual-studio-2010 visual-c++-2010 c++11

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

提前致谢!

jal*_*alf 44

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

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

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

  • 简单来说,`std :: function`是一个包装类,是对所有可调用对象的抽象,无论是函数指针还是函子.而且它不能免费使用.但是如果你避免使用包装器,只是直接使用一个仿函数或一个lambda,就没有开销 (9认同)
  • @shoosh:那么?添加很多`std:string`的实例化也会产生很多开销.但这不是问题,也不是我的答案.它们与函数对象和lambda有关.`std :: function`都不是. (8认同)
  • 根据经验,这是错误的.添加大量`std :: functions`的实例化会显着增加可执行文件的大小,至少在VS2010中是这样.我刚刚完成了这个测试. (4认同)

sbi*_*sbi 18

在引擎盖下,

void f(char delim)
{
  std::for_each( seq.begin()
               , seq.end()
               , [=](const T& obj){std::cout << obj << delim;} );
}
Run Code Online (Sandbox Code Playgroud)

大约翻译成

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) );
}
Run Code Online (Sandbox Code Playgroud)

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

  • 他是这样的; `[=]`表示应该按值捕获所有本地对象. (4认同)
  • 请注意,必须明确捕获`delim`. (2认同)