假設我有一個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
這很有道理,爲什麼我不能像'std :: vector'那樣使用內存池。我知道在這種情況下存在UB,但我仍然懷疑實現中使用了多少內存。源看起來好像會有_less_內存使用,因爲多個類型T的請求只會導致1的分配。 –
作爲我之前評論的附加組件,我懷疑該向量會覆蓋連續的未分配的插槽內存池,導致內存池跟蹤空閒/使用的插槽損壞。 –