关于内存池的效率

来源:百度知道 编辑:UC知道 时间:2024/06/14 16:52:48
生成两条链表L1和L2,为L1申请内存空间。当有程序使用内存,从L1解下一下结点,交给L2。使用后,L2将结点交还给L1。省去了申请内存的时间。
问题:1.这样构思内存池是否合理?
2.如果使用LIST容器,当L2交还结点给L1时,list的push_back是否会影响效率(比使用普通链表如何)?

我觉得合理与否并不在于使用何种容器,关键是看程序运行的环境和L2申请的内存的大小问题。
首先内存池是一种以“空间换时间”的算法。
其次,如果L2每次申请的内存大小都是一样的,使用内存池的确可以提高内存的分配效率;否则,这个问题已经涉及到操作系统中关于内存管理的相关概念了,你可以参与有关方面的书籍进行你的内存分配计划。

至于效率,个人觉得这几个链表操作并不算复杂,只是几个指针的修修改改,自己写的效率应该高些,我是崇尚DIY的。

不太听得懂耶,太专业了

先介绍一下经典的内存池(MemPool)技术吧:
经典的内存池(MemPool)技术,是一种用于分配大量大小相同的小对象的技术。通过该技术可以极大加快内存分配/释放过程。经典的内存池只涉及两个常量:MemBlockSize、ItemSize(小对象的大小,但不能小于指针的大小,在32位平台也就是不能小于4字节),以及两个指针变量MemBlockHeader、FreeNodeHeader。开始,这两个指针均为空。其中指针变量MemBlockHeader是把所有申请的内存块(MemBlock)串成一个链表,以便通过它可以释放所有申请的内存。FreeNodeHeader变量则是把所有自由内存结点(FreeNode)串成一个链。

内存申请过程分为两种情况:
* 在自由内存结点链表(FreeNodeList)非空。Alloc过程只是从链表中摘下一个结点的过程。
* 否则,意味着需要一个新的内存块(MemBlock)。这个过程需要将新申请的MemBlock切割成多个Node,并把它们串起来。MemPool技术的开销主要在这。

MemPool技术申请内存/释放内存均极其快(比AutoFreeAlloc慢)。其内存分配过程多数情况下复杂度为O(1),主要开销在FreeNodeList为空需要生成新的MemBlock时。内存释放过程复杂度为O(1)。

故,楼主事先为L1申请了内存,而L2未分配,所以,主要开销是在为L2为空时申请内存,也就是在L2交还接点给L1后再次分配内存而产生开销,而不是在为L1申请内存时产生的。

个人见解,讨论请发邮件incubu