2009-08-09 86 views
11

何時應該比對象池更喜歡動態分配的對象?對象池與動態分配

我需要每秒創建並銷燬數千個對象。它是否足以決定支持對象池?

謝謝。

+0

像往常一樣 - 這取決於。如果你可以使用對象池,你顯然不需要創建和銷燬東西。所以我們需要更多的細節。 – 2009-08-09 09:14:35

回答

7

破壞對象,取消分配,分配和構造的預期成本高於重新初始化新用途的成本。

+3

我會說「可能很低」 - 完全有可能(甚至可能)初始化是昂貴的階段。 – 2009-08-09 09:13:18

+0

我改寫了我的答案。閱讀其他答案,似乎我是唯一一個在對象池(其中保存了一個可供使用的構造對象列表)和內存池(這是一種延遲釋放的內存管理技術)有時是毀滅,有時毀滅完全沒有完成 - 所以它是一步完成的)。 – AProgrammer 2009-08-09 09:26:01

+0

我不確定我明白你在這裏說什麼。我一直認爲對象池的好處只是內存重用?所有新對象都需要構建,無論如何都會破壞所有舊對象 - 您無法在那個時間保存? – 2009-08-10 09:40:26

3

通常,如果您每秒創建並銷燬數千個對象,則至少應該使用對象池。

您可以使用純分配特定大小對象的自定義分配器。重寫新的並預先爲您的對象分配一個堆。使用位域和數組相對簡單。

如果對象很小,基本上自定義堆的內存效率更高(相對於小對象大小,堆開銷相當高);它更快;它可以防止堆碎片;它更容易調試。

8

是的,這足以支持對象池。

報價Boost文檔

何時應該使用池?

通常使用池時有很多 大量的分配和釋放 的小對象。另一種常見用法 是上面的情況,其中很多對象可能會從內存中丟失。

Boost Pool

7

測量,測量,測量。那麼你會知道,你將不必依賴於猜測或指導。

此外,如果Dirk Grunwald的CustomMalloc仍然可用,請嘗試一下。它綜合了針對單個應用程序的需求而調整的malloc的實現。