2014-02-26 61 views
1

我知道很容易爲單個對象創建內存池,但是我需要爲數組創建內存池。我目前使用的內存池有一個連續內存塊的地址向量和一個指向這些塊中每個對象的堆棧,所以當你從池中分配時,你只需彈出堆棧,當你釋放時,你只需要將一個對象的地址回到它。不過,我也需要一個等同的數組。類似這樣的:是否可以實現與數組而不是單個對象一起使用的內存池?

template<typename T> 
class ArrayPool 
{ 
public: 
ArrayPool(); 
~ArrayPool(); 

T* AllocateArray(int x); //Returns a pointer to a T array that contains 'x' elements. 
void FreeArray(T* arr, int x); //Returns the array to the free address list/stack/whatever/ 
}; 

有這樣的事情被執行了嗎?我想象一個有這樣一個池的大問題 - 如果確保ALlocateArray返回的數組在內存中是連續的,那麼我基本上就像沒有使用memorypool一樣。只需在現場分配數組。使用正常的對象池,每次我只分配1個對象。對於數組,我可以每次分配一個不同大小的數組,所以一旦數組被釋放,它將不會與一個新的不同大小兼容,除非我將stich數組和一些鏈表類似的結構一起使用,但隨後他們贏了不是連續的。

回答

2

當前您的分配器利用了所有分配大小相同的事實。這簡化並加快了分配和釋放,並且意味着內存碎片是不可能的。

如果您必須分配任何大小的數組,那麼您想要的是通用分配器而不是池分配器。下一步做什麼取決於你爲什麼首先使用池分配器。我能想到的池分配器的另外兩個特點,可能是相關的,有可能是其他人:

  • 所有的記憶來自於當您創建池
  • 所有內存可以被釋放指定的特定區域一旦沒有釋放每個單獨的分配,通過重置池。

如果你不需要自己控制分配任何特殊功能,那麼就使用vector或全球operator newmalloc分配你的記憶。如果你確實需要特殊功能,那麼你可能會想要從現成的架構中分配一個分配器,而不是實現自己的分配器。如果你真的想深入瞭解一個好的內存分配器的工作細節,那麼看看http://g.oswego.edu/dl/html/malloc.html,或許可以根據你的使用情況進行調整。

但是,如果您確實需要爲有限的目的手動分配一個分配器,那麼基本思想是,您可以選擇一些數據結構(而不​​是您可以從中獲取第一個的空閒節點列表) )包含不同大小的空閒塊,這使您可以快速找到足夠大的塊以滿足當前請求。在它更大的情況下,您可以選擇拆分塊,返回其中的一部分,並將其餘部分保留爲新的較小空閒塊。在兩個空閒塊相鄰的情況下,你可以選擇將它們合併成一個較大的空閒塊。

一個常見的策略是保持特定大小的塊的池狀列表(例如16,32,64 ...)。如果請求足夠小,請使用其中一個來滿足它。如果沒有,做一些更復雜的事情。但正如我所說,如果你想看到很多技巧一起工作,那麼看看dlmalloc。

0

你可以做的是有固定的大小,只對那些工作。例如400個32字節的數組,200個128b,100個1024b,50個8096b或類似的東西。當有東西要求大小爲N的數組時,您可以使用自由數組匹配最接近的大小。

每個尺寸需要多少可能需要很多調整。

這將允許您比允許自定義大小更自由地重新使用數組。

1

你究竟想從中贏得什麼?爲什麼僅僅把每個數組當作一個對象是不夠的呢?除非你是,否則被束縛在內存中,或者構建數組元素的時間真的很多,並且不會被浪費,這聽起來像是一個典型的例子premature optimization。如果以上是你的問題,我會在深入研究之前先研究其他數據結構(不是數組)。 你的時間(得到這個工作和它的怪癖將是一個星期左右,methinks)是方式比幾個便士電腦時間或內存保存更有價值。

相關問題