私は注文するために類似のタイプのオブジェクトを多数作成しているパフォーマンスクリティカルなアプリケーションを書いています。メモリの割り当てにboost::singleton_poolを使用しています。最後に、私のクラスは次のようになります。
class MyOrder{
std::vector<int> v1_;
std::vector<double> v2_;
std::string s1_;
std::string s2_;
public:
MyOrder(const std::string &s1, const std::string &s2): s1_(s1), s2_(s2) {}
~MyOrder(){}
static void * operator new(size_t size);
static void operator delete(void * rawMemory) throw();
static void operator delete(void * rawMemory, std::size_t size) throw();
};
struct MyOrderTag{};
typedef boost::singleton_pool<MyOrderTag, sizeof(MyOrder)> MyOrderPool;
void* MyOrder:: operator new(size_t size)
{
if (size != sizeof(MyOrder))
return ::operator new(size);
while(true){
void * ptr = MyOrderPool::malloc();
if (ptr != NULL) return ptr;
std::new_handler globalNewHandler = std::set_new_handler(0);
std::set_new_handler(globalNewHandler);
if(globalNewHandler) globalNewHandler();
else throw std::bad_alloc();
}
}
void MyOrder::operator delete(void * rawMemory) throw()
{
if(rawMemory == 0) return;
MyOrderPool::free(rawMemory);
}
void MyOrder::operator delete(void * rawMemory, std::size_t size) throw()
{
if(rawMemory == 0) return;
if(size != sizeof(Order)) {
::operator delete(rawMemory);
}
MyOrderPool::free(rawMemory);
}
最近、 boost::singleton_pool を使用した場合のパフォーマンス上の利点について質問を投稿しました。boost::singleton_poolとデフォルト アロケータのパフォーマンスを比較したところ、パフォーマンス上の利点は得られませんでした。私のクラスに std::string 型のメンバーがあり、その割り当てがカスタム アロケーターによって管理されていないことを誰かが指摘したとき、私は std::string 変数を削除し、テストを再実行しました。今回は、かなりのパフォーマンスの向上に気付きました。
さて、私の実際のアプリケーションでは、時刻 std::string と std::vector のメンバー変数を取り除くことができません。std::string および std::vector メンバー変数でboost::pool_allocatorを使用する必要がありますか?
boost::pool_allocator は、基礎となる std::singleton_pool からメモリを割り当てます。メンバー変数が異なるかどうかは問題になりますか (MyOrder クラスに複数の std::string/std::vector 型があります。また、std::string/std::vector 型を含む MyOrder 以外のクラスにプールを使用しています)メンバーとしても) 同じメモリ プールを使用しますか? もしそうなら、どうすれば彼らがどちらかの方法で行うことを確認できますか?