私は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;
}
次のような別の関数オブジェクトを使用した場合よりも、wayyyyyの速度が遅くなりました。
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;
}
なぜなのかわかりません。クラスに大量のデータがあるため、速度低下は*これによるものですか?それは奇妙に思えます。それとも、関数オブジェクトの使用方法と関係がありますか?