gpt4 book ai didi

recursion - 递归 lambda 的开销

转载 作者:行者123 更新时间:2023-12-03 07:57:34 25 4
gpt4 key购买 nike

与常规递归函数相比,递归 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;
}

最佳答案

通过将其存储为 std::function 递归地使用 lambda 会产生开销,虽然它们本身基本上是仿函数。看来gcc不能很好地优化,这可以在直接 comparison 中看到.

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

例如,我创建的仿函数看起来像这样 second demo .

即使引入了对不纯函数的调用,例如 std::rand ,没有递归 lambda 或自定义仿函数的性能仍然更好。这是一个 third demo .

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

关于recursion - 递归 lambda 的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17066667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com