
说说我的理解吧(不一定正确)。
Effective C++ 说的是不适用于 STL 的迭代器和函数对象。为什么呢? 前面说了,pass by reference 通常意味真正传递的是指针。STL 的迭代器其实是一种“泛型指针”,是一种重载了 operator*,operator->,operator++,operator--等操作的 class template,既然迭代器可以看成是“指针”,那就没有必要使用 pass by reference了。
函数对象比较难解释,函数对象是行为类似函数的一个对象,一般是重载了operator() 的 struct 或者 class。这种函数对象,一般没有构造和析构函数,体积很小。在我们调用函数对象的时候,实际上不是真的传递了这个对象,而是传递了指向该对象的一个指针。事实上,把函数对象传递给算法时,比传递一个函数的效率高得多。我们可以做个小测试:
运行结果如图:
这只是利用 vector<int> 做的一个小测试,我们会发现,使用函数对象效率比使用一个函数高了一倍。
回到我们刚刚说的,传递函数对象,其实是传递了指向该对象的指针。
例如:
comp 是一个指向函数的指针,因此每次 sort 用到它的时候,编译器会使用产生一个间接函数调用,通过指针调用。既然函数对象也是有“指针”的用法,那么它也可以不用 pass by reference。
说的那么多,只有 test 才有说服力。如下:
测试一下结果:
然后将 foo 函数改成
将 "pass by reference" 改成 "pass by value" 的文本
再运行:
好吧我知道差别不是特别多而且受rand的影响,不过多次测试可以得到,平均来说,函数对象使用 pass by value 比 pass by reference 快那么一丢丢吧。
真正的解答要等到真大神来解释了。
