我知道STL中使用的函数对象只是简单的对象,我们可以像函数一样操作它。我可以说函数和函数对象的工作原理是相同的。如果这是真的,那么为什么我们应该使用函数对象而不是函数呢?
主要好处是对函数对象(函子)的调用通常是可内联的,而对函数指针的调用通常不是(主要的例子是比较 C 的qsort
到 C++ 的std::sort
)。对于重要的对象/比较器,C++ 应该杀死 C 的排序性能。
还有其他好处,例如,您可以将状态绑定或存储在函子中,而原始函数则无法做到这一点。
Edit抱歉没有直接参考,但 Scott Meyers 声称在某些情况下改进了 670%:qsort 与 std::sort 的性能比较? https://stackoverflow.com/questions/4708105/performance-of-qsort-vs-stdsort
Edit 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)