递归lambda的开销

3XX*_*XX0 7 recursion lambda c++11

与常规递归函数相比,递归lambda函数是否会引发任何开销(因为我们必须将它们捕获到std :: function中)?
这个函数与仅使用常规函数的类似函数有什么区别?

int main(int argc, const char *argv[])
{
    std::function<void (int)> helloworld = [&helloworld](int count) {
        std::cout << "Hello world" << std::endl;
        if (count > 1) helloworld(--count);
    }; 
    helloworld(2);
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

ste*_*fan 6

通过将其存储为 a递归使用 lambda 会产生开销std::function,尽管它们本身基本上是函子。好像gcc优化不好,直接对比就知道了。

实现 lambda 的行为,即创建函子,可以gcc再次优化。您可以将 lambda 的具体示例实现为

struct HelloWorldFunctor
{
   void operator()(int count) const
   {
      std::cout << "Hello world" << std::endl;
      if ( count > 1 )
      {
         this->operator()(count - 1);
      }
   }
};
int main()
{
   HelloWorldFunctor functor;
   functor(2);
}
Run Code Online (Sandbox Code Playgroud)

对于我创建的函子的示例,在第二个演示中看起来像这样。

即使引入了对不纯函数的调用,例如std::rand,没有递归lambda 或自定义函子的性能仍然更好。这是第三个演示

结论:使用 astd::function会产生开销,尽管根据用例可能可以忽略不计。由于这种用法会阻止一些编译器优化,因此不应广泛使用。

  • *** 不是 *** 创建开销的 lambda。我再说一遍,它 *** 不是 *** lambda。它是 `std::function`,它使用类型擦除来存储 lambda。 (7认同)