C++内存管理:其四、使用链表实现简易版内存池

一、为什么需要内存池?

按照标准库的写法,new一个对象的时候,会malloc一块内存;delete的时候会free这块内存。频繁的malloc与free存在两个问题:
(1)耗时,这两个都是操作系统层级的函数,会相对耗时。
(2)malloc的内存中存在上下两个cookie,用来标记这块内存的起止地址,而且内存要向上取8的倍数。如果大量malloc,那么内存内存浪费还是比较惊人的。
这个问题,内存池可以很好地解决。

二、什么是内存池?

既然频繁的malloc不是一件好事情,那么我们可以一次malloc申请一大块内存。当需要new一个对象的时候,可以在已经申请好的内存里面执行构造函数。在我们delete这个对象之后,这个内存上还可以用来构造其它对象。
这就是内存池设计的基本思想:一次性申请大块内存,用于多次new对象,避免频繁的malloc与delete。

三、链表实现内存池的基本思想

你如果在中文搜索引擎上面搜索“内存池的实现”,出现最多的方法就是链表实现内存池。有一说一,这个名字取得不好,非常容易让人产生误解。比如:
用链表实现内存池,链表本来就是不连续的内存,那就说明要malloc多次,那么这个内存池有什么意义???
答案:内存池就是一次(扩容情况下多次)malloc的内存,是连续的内存。只不过将连续的内存使用链表管理起来了。

你可能感兴趣的:(c++,链表,java)