std::function 是一种类型擦除类.
它需要从它构造的任何东西,并删除除了以下所有内容:
可能
这涉及一些开销.典型的体面质量std::function将具有小对象优化(如小字符串优化),当使用的内存量很小时避免堆分配.
函数指针将适合那里.
但是,仍有开销.如果std::function使用兼容的函数指针初始化a ,而不是直接调用有问题的函数指针,则执行虚函数表查找,或调用其他函数,然后调用函数指针.
使用vtable实现,即可能的高速缓存未命中,指令高速缓存未命中,然后是另一指令高速缓存未命中.使用函数指针,指针可能存储在本地,并且直接调用它,导致一个可能的指令高速缓存未命中.
最重要的是,在实践中,编译器比std::functions 更好地理解函数指针:许多编译器可以在内联或整个程序优化期间发现指针是常量值.我从来没有见过一个可以解决这个问题的人std::function.
对于较大的对象(比如sizeof(std::string)在一个实现中更大),堆分配也由std::function.这是另一项费用.对于函数指针和引用包装器,SOO由标准保证.
直接存储lambda而不将其存储在a std::function中甚至比函数指针更好:在这种情况下,正在运行的代码隐含在lambda的类型中.这使得代码能够计算出调用时会发生什么,并且编译器易于内联.
只在需要时才进行类型擦除.
| 归档时间: |
|
| 查看次数: |
1448 次 |
| 最近记录: |