2014-01-13 32 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); –