【发布时间】:2011-10-08 13:03:19
【问题描述】:
我需要对内存池的概念和实现进行一些说明。
维基上的memory pool,上面写着
也称为固定大小块分配,..., 因为这些实现由于变量而遭受碎片化 块大小,不可能在实时系统中使用它们 由于性能。
“可变块大小导致碎片”是如何发生的?固定大小的分配如何解决这个问题?这个 wiki 描述对我来说听起来有点误导。我认为固定大小的分配或可变大小无法避免碎片。在内存池上下文中,通过为特定应用程序设计的特定内存分配器来避免碎片,或者通过限制使用预期的内存块来减少碎片。
同样通过几个实现示例,例如Code Sample 1和Code Sample 2,在我看来,要使用内存池,开发人员必须非常了解数据类型,然后将数据切割、拆分或组织成链接的内存块(如果数据接近链表)或分层链接块(如果数据更分层组织,如文件)。此外,似乎开发人员必须事先预测他需要多少内存。
好吧,我可以想象这对于一组原始数据非常有效。内存模型不那么明显的 C++ 非原始数据类呢?即使对于原始数据,开发人员是否应该考虑数据类型对齐?
是否有适用于 C 和 C++ 的良好内存池库?
感谢任何cmets!
【问题讨论】:
-
我认为基本思想是你为每一类对象都有一个池,这样每个对象都需要相同的空间。这样,您可以轻松地分配、释放和重用内存,因为您可以精确地重用释放的块。
-
如果内存池实现是由它允许分配的项目类型模板化的,那么编译器会隐藏它繁琐的事实,生成大量必要的样板代码。
-
Modern C++ Design 对这个话题进行了很好的讨论,我推荐这本书在话题之外也很有趣。
-
C++ 默认使用 C 分配器,它偏向于更大的分配。据我了解,分配 4 个字节与 64 个字节一样多。如果您的应用程序在小分配上非常繁重(智能指针是书中的示例),您可以看到通过摊销使用 C 分配器的性能成本获得的性能提升。
标签: c++ memory-management fragmentation memory-pool