2016-07-24 64 views
0

假設我有一個STL兼容(ish)分配器。我想要一個STL容器(std::vector)的多個實例(百萬)使用該分配器的相同實例(我們假定線程安全得到保證)。此實現是否按預期工作?我可以爲多個向量使用一個內存池嗎?

MemoryPool<int> mypool; 
std::vector<std::vector<int, MemoryPool<int>>> myvec; 
myvec.assign(BIG_NUMBER, std::vector<int, MemoryPool<int>>{1, mydefault, mypool}); 

我也嘗試:

std::vector<std::vector<int, MemoryPool<int>>> myvec; 
myvec.assign(BIG_NUMBER, {mydefault}); 

...並得到了相同的內存使用情況。

問題是我的內存使用量正在爆炸與此實現。從默認分配器的〜12MB到內存池分配器的〜4GB。

我假設發生的事情是每個向量都得到我的內存分配器的新實例,由於內存池的大塊大小,導致大量浪費的存儲空間。我推斷如果他們都使用相同的內存池實例,則內存使用情況將更接近默認分配器。

僅供參考,我使用這個存儲池的實現:https://github.com/cacay/MemoryPool

回答

3

不能使用說MemoryPool作爲std::vector分配器,因爲它是爲固定大小的分配:

內存池有幾個缺點:

  • 對象具有必須事先知道的固定大小。這通常不是 問題,大多情況下,如果您需要將它們分配在一堆。

還請參閱comment above the declaration of the allocate() function

// Can only allocate one object at a time. n and hint are ignored 
pointer allocate(size_type n = 1, const_pointer hint = 0); 

std::vector因爲它分配內存以適合至少capacity()元件所需的單個連續塊不符合此約束。所以它調用allocate()函數n設置爲capacity(),但MemoryPool工作,就好像n=1通過。MemoryPool甚至沒有提供對這種無效使用的保護(以斷言的形式)。

+0

這很有道理,爲什麼我不能像'std :: vector'那樣使用內存池。我知道在這種情況下存在UB,但我仍然懷疑實現中使用了多少內存。源看起來好像會有_less_內存使用,因爲多個類型T的請求只會導致1的分配。 –

+0

作爲我之前評論的附加組件,我懷疑該向量會覆蓋連續的未分配的插槽內存池,導致內存池跟蹤空閒/使用的插槽損壞。 –

相關問題