我正在编写一个性能关键的应用程序,在该应用程序中我创建了大量类似类型的对象来下订单。我正在使用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 的成员变量。我应该将boost::pool_allocator与我的 std::string 和 std::vector 成员变量一起使用吗?
boost::pool_allocator 从底层 std::singleton_pool 分配内存。不同的成员变量是否重要(我的 MyOrder 类中有多个 std::string/std::vector 类型。此外,我正在为 MyOrder 以外的包含 std::string/std::vector 类型的类使用池作为成员)使用相同的内存池?如果是这样,我如何确保他们以一种或另一种方式做事?