对象池与动态分配

15

何时应该优先使用对象池而不是动态分配的对象?

我需要每秒创建和销毁成千上万个对象。这本身就足以决定支持使用对象池吗?

谢谢。


像往常一样,这要看具体情况。如果您可以使用对象池,显然就不需要频繁地创建和销毁对象。所以我们需要更多的细节。 - anon
4个回答

11

是的,这足以支持使用对象池。

引用Boost文档

何时应该使用对象池?

当需要大量分配和释放小对象时,通常会使用对象池。另一个常见用途是上面提到的情况,即可能有许多对象被删除。

请参阅Boost Pool库。


9

测量、测量、再测量。这样你就会知道,而不必依赖猜测或指导方针。

另外,如果Dirk Grunwald的CustomMalloc还可用,可以尝试一下。它能合成一个适用于单个应用需求的malloc实现。


8
预计销毁对象、释放内存、分配内存和构造新对象的成本高于重新初始化以供新用途使用的成本。

3
我会说“可能很低” - 初始阶段很可能是昂贵的,甚至有可能。 - anon
我重新阐述了我的回答。阅读其他回答,似乎只有我区分对象池(其中将已构造对象的列表保存供使用)和内存池(这是一种内存管理技术,可延迟解除分配——有时也延迟对象销毁,有时则纯粹不进行销毁——以便可以在一个步骤中完成)。 - AProgrammer
我不确定我理解你在这里说什么。我一直认为对象池的好处只是内存重用?所有新对象都需要构造,所有旧对象都需要销毁 - 你不能节省那个时间吗? - Richard Corden
那就是我试图暗示的区别。你描述的是我一直所谓的“内存池”(好吧,我也看过许多变体)。我所谓的“对象池”是一种模式,其中您将已经构造的对象放在池中,并在不再需要它们时将它们使用并放回到池中而不销毁它们。与内存池不同,重点是减少分配/释放时间;而在对象池中,重点是建立/销毁时间。显然,这不太普遍适用。 - AProgrammer
谢谢 - 我现在明白了,我只考虑了内存池的情况。 - Richard Corden

5
通常,如果您每秒创建和销毁数千个对象,至少应该使用对象池。
您可以使用自定义分配器,它仅分配特定大小的对象。重写new并预先为您的对象专门分配一个堆。使用位域和数组相对简单。
基本上,如果对象很小(与小对象大小相比,堆开销相当高),则自定义堆更具内存效率;它更快;它防止堆碎片化;而且更容易调试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接