速度差异:使用* this在一个大类中分离仿函数VS operator()

时间:2009-11-12 08:19:49

标签: c++ performance operators this operator-keyword

我正在使用c ++ STL堆算法,我在它周围写了一个包装类,所以我可以做一些其他的东西。当我尝试使用下面的代码时,例如:

//! Min-heap wrapper class.
class FMMHeap{
public:
    FMMHeap(Vector &phi) : _phi(phi) {}
    bool operator()(unsigned p1, unsigned p2) {return fabs(_phi(p1)) > fabs(_phi(p2)); }
    inline void pop(){ pop_heap(_heap.begin(),_heap.end(),*this); _heap.pop_back(); }
    [...lots of other stuff...]
    vectorU32 _heap;
    Vector &_phi;
}

比我有一个像这样的单独的函数对象时,它的速度慢得多:

struct HeapSort{
public:
    HeapSort(Vector &phi) : _phi(phi) {}
    bool operator()(unsigned p1, unsigned p2) {return fabs(_phi(p1)) > fabs(_phi(p2)); }
private:
    Vector &_phi;
};

class FMMHeap{
public:
    FMMHeap(Vector &phi) : cmp(phi) {}
    inline void pop(){ pop_heap(_heap.begin(),_heap.end(),cmp); _heap.pop_back(); }
    [...lots of other stuff...]
    vectorU32 _heap;
    HeapSort cmp;
}

我不确定为什么会这样。减速来自*这是因为班级有很多数据吗?这看起来很奇怪。或者它与如何使用函数对象有关?

2 个答案:

答案 0 :(得分:8)

我不确定:但也许pop_heap最终会复制您传入的仿函数对象。 FMMHeap的副本比简单的HeapSort

答案 1 :(得分:0)

STL容器的最大加速是内联它们,这样编译器就可以找出如何删除和重新排序的东西。

很好的猜测,编译器设法以一种方式内联外部仿函数,即const传播阻止它在慢速版本中这样做。

如果bool运算符是const,慢速版会发生什么?