2014-01-13 30 views
1

我知道我可以按如下方式使用升压singleton_pool动态参数提升内存池

typedef boost::singleton_pool< OrderTag,sizeof(memSize)>Pool; 

这是模板类和MEMSIZE必须在编译时间。但只在运行时,它的值是已知的,我得到MEMSIZE填充可能会因不同的设置而有所不同。这是否意味着我无法在动态场景中使用boost :: pool类,因为它们都是模板类?

+1

如果您正在存储一个对象池,它是该对象的大小。如果你正在存储一个指针池,那么它就是指针的大小。 – thecoshman

+0

嗯,不,它是作为参数传入应用程序的字节块的大小,可能会有所不同... –

+0

什么?我无法理解你所说的话。请提供一个SSCE – thecoshman

回答

1

您可以使用boost::pool接口和它的构造函数初始化大小:

void func() 
{ 
    std::size_t memSize = getMemSize(); 
    boost::pool<> p(memSize); 

    char* ptr = p.malloc(); 
} 

或者使用的boost::singleton_pool接口大小为1,然后分配多个块(你一定要BEFORE资料这个解决方案执行它):

typedef boost::singleton_pool<MyPoolTag, sizeof(char)> my_pool; 
void func() 
{ 
    std::size_t memSize = getMemSize(); 

    char * ptr = my_pool.ordered_malloc(memSize); 

    my_pool::purge_memory(); 
} 
+1

我希望Boost能以这种方式记录它们的接口:) –

+0

boost :: pool线程安全吗? –

+0

的单路不干活的意思是它的工作原理,但需要永恒运行的allocations.Doing像这样一个循环:\t demo_block * OBJ =(demo_block *)MyMemPool :: ordered_malloc(的sizeof(demo_block)); \t \t obj-> alpha = 100; \t \t obj-> beta = 200; \t \t obj-> gama = 300; \t \t MyMemPool :: ordered_free(obj); –