Sto scrivendo un'applicazione performance critical in cui sto creando un numero elevato di oggetti di tipo simile per effettuare ordini. Sto usando boost::singleton_pool per allocare memoria. Finalmente la mia classe sembra così.Gestione delle variabili membro std :: string/std :: vector durante l'utilizzo di 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);
}
Recentemente ho inviato un question su miglioramento delle prestazioni nell'utilizzo boost :: singleton_pool. Quando ho confrontato le prestazioni di boost::singleton_pool e l'allocatore predefinito, non ho ottenuto alcun vantaggio in termini di prestazioni. Quando qualcuno ha indicato che la mia classe aveva membri del tipo std :: string, la cui allocazione non era governata dal mio allocatore personalizzato, ho rimosso le variabili std :: string e reran i test. Questa volta ho notato un notevole aumento delle prestazioni.
Ora, nella mia applicazione effettiva, non posso liberarmi di variabili membro di tempo std :: string e std :: vector. Dovrei usare boost::pool_allocator con le mie variabili membro std :: string e std :: vector?
boost :: pool_allocator alloca la memoria da uno std :: singleton_pool sottostante. Importerà se diverse variabili membro (ho più di un tipo std :: string/std :: vector nella mia classe MyOrder. Inoltre sto utilizzando pool per classi diverse da MyOrder che contengono i tipi std :: string/std :: vector come membri) utilizzare lo stesso pool di memoria? Se lo fa, come faccio ad assicurarmi che facciano in un modo o nell'altro?
Usa const e nel tuo costruttore. –
@EternalLearner Good Point. Ciò impedirà una copia. Fatto. – sank
non sarebbe un po 'più appropriato usare effettivamente std :: weak_ptr's o qualcosa per lo std :: stringhe qui? prendere riferimenti per copie interne private mi sembra sempre sbagliato. anche se rinvii la copia ... –