gpt4 book ai didi

c++ - std::function 的开销

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:56 30 4
gpt4 key购买 nike

我见过许多人建议不要使用 std::function<> 的例子因为它是一个重量级的机制。有人可以解释为什么会这样吗?

最佳答案

std::function 是类型删除类。

它采用任何构造它的东西,并删除除以下内容之外的所有内容:

  • 调用有问题的签名(可能隐式转换)
  • 销毁
  • 复制
  • 转换回准确的原始类型

可能

  • 移动

这涉及一些开销。典型的优质 std::function 将进行小对象优化(如小字符串优化),避免在使用的内存量较小时进行堆分配。

一个函数指针将适合那里。

但是,仍然存在开销。如果您使用兼容的函数指针初始化 std::function,而不是直接调用有问题的函数指针,您可以执行虚函数表查找,或调用其他函数,然后调用该函数指针。

对于 vtable 实现,这可能是缓存未命中,一条指令缓存未命中,然后是另一条指令缓存未命中。对于函数指针,指针可能存储在本地,直接调用它,导致可能有一次指令缓存未命中。

除此之外,在实践中,编译器比 std::function 更能理解函数指针:许多编译器在内联或整个程序优化期间可以弄清楚指针是常量值。我从未见过使用 std::function 实现这一目标的。

对于较大的对象(比如在一个实现中大于 sizeof(std::string)),堆分配也由 std::function 完成。这是另一个成本。对于函数指针和引用包装器,SOO 由标准保证。


直接存储 lambda 而不是将其存储在 std::function 中甚至比函数指针更好:在这种情况下,正在运行的代码隐含在 lambda 的类型中。这使得代码可以轻松计算出调用时将发生什么,并且编译器可以轻松进行内联。

只在需要时进行类型删除。

关于c++ - std::function 的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880642/

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