使用std :: function开销

Cur*_*ous 4 c++ function c++11 c++14

我见过许多人建议反对使用的情况,std::function<>因为它是一种重量级的机制.有人可以解释为什么会这样吗?

Yak*_*ont 9

std::function 是一种类型擦除类.

它需要从它构造的任何东西,并删除除了以下所有内容:

  • 调用有问题的签名(可能隐式转换)
  • 破坏
  • 复制
  • 回到精确的原始类型

可能

  • 移动

这涉及一些开销.典型的体面质量std::function将具有小对象优化(如小字符串优化),当使用的内存量很小时避免堆分配.

函数指针将适合那里.

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

使用vtable实现,即可能的高速缓存未命中,指令高速缓存未命中,然后是另一指令高速缓存未命中.使用函数指针,指针可能存储在本地,并且直接调用它,导致一个可能的指令高速缓存未命中.

最重要的是,在实践中,编译器比std::functions 更好地理解函数指针:许多编译器可以在内联或整个程序优化期间发现指针是常量值.我从来没有见过一个可以解决这个问题的人std::function.

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


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

只在需要时才进行类型擦除.

  • 函数指针和`reference_wrapper`保证小对象优化. (4认同)