功能对象的好处?

leg*_*end 3 c++ stl function object

我知道STL中使用的函数对象只是一个简单的对象,我们可以像操作一样操作它.我可以说功能和功能对象的工作是一样的.如果这是真的,那么为什么我们应该使用函数对象而不是函数?

Nat*_*nst 6

主要的好处是对函数对象(仿函数)的调用通常是可内联的,而对函数指针的调用通常不是(主要的例子是将C语言qsort与C++ 进行比较std::sort).对于非平凡的对象/比较器,C++应该杀死C的排序性能.

还有其他好处,例如,您可以在仿函数中绑定或存储状态,使用该函数不能执行原始函数.

编辑 道歉没有直接参考,但Scott Meyers在某些情况下声称改进了670%: qsort vs std :: sort的表现?

编辑2 与绩效说明的段落是这样的:

函数指针参数禁止内联的事实解释了一个观察结果,即长期的C程序员经常发现很难相信:C++的排序实际上总是让C的qsort在速度方面感到尴尬.当然,C++具有函数和类模板来实例化和看起来很滑稽的operator()函数,而C进行简单的函数调用,但所有C++"开销"都在编译过程中被吸收.在运行时,sort对其比较函数进行内联调用(假设比较函数已经内联声明,并且在编译期间它的主体可用),而qsort通过指针调用其比较函数.最终结果是排序运行得更快.在我对一百万双打矢量的测试中,它的速度提高了670%,但是不要接受我的话,自己尝试一下.很容易验证,当比较函数对象和实际函数作为算法参数时,有一个抽象奖励.

-Scott Meyers "Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library" - Item 46
Run Code Online (Sandbox Code Playgroud)