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)
通过将其存储为 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会产生开销,尽管根据用例可能可以忽略不计。由于这种用法会阻止一些编译器优化,因此不应广泛使用。