Jav*_*eta 19 c++ pass-by-value function-object
我刚刚阅读了经典书籍"Effective C++,3rd Edition",在第20项中,作者得出结论,内置类型,STL迭代器和函数对象类型更适合于传值.我完全理解内置函数和迭代器类型的原因,但为什么函数对象应该是值传递,因为我们知道它仍然是类类型的?
Jer*_*fin 19
在典型情况下,函数对象将具有很少或(更常见)没有持久状态.在这种情况下,传递值可能根本不需要实际传递任何东西 - 传递的"值"基本上很少或仅仅是"这是对象"的占位符.
鉴于许多函数对象中的代码量很少,这导致了进一步的优化:编译器通常很容易扩展函数对象的内联代码,因此没有参数传递,也根本不涉及函数调用.
当你传递一个指针或引用时,编译器可能会做同样的事情,但它并不那么容易 - 更常见的是你最终会创建一个对象,传递它的地址,然后是函数通过该指针调用该对象的调用操作符.
编辑:这也许值得一提,同样适用于lambdas,因为它们实际上只是伪装的函数对象.您不知道该类的名称,但是它们在紧邻的范围内创建了一个类,该类重载了函数调用操作符,这是在您"调用"lambda时调用的.[谢谢@Mark Garcia.]
按值传递函数对象的首要原因是标准库要求传递给其算法的函数对象是可复制的.C++11§25.1/ 10:
[注意:除非另有说明,否则允许将函数对象作为参数的算法自由复制这些函数对象.对象标识很重要的程序员应考虑使用指向非复制实现对象的包装类,如
reference_wrapper<T>(20.8.3)或某些等效解决方案. - 尾注]
其他答案很好地解释了基本原理.