2009-08-09 85 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的实现。