一、前言
作为C++程序员,想必对于内存操作这一块是比较熟悉和操作比较频繁的;
比如申请一个对象,使用new,申请一块内存使用malloc等等;
但是,往往会有一些困扰烦恼着大家,主要体现在两部分:
- 申请内存后忘记释放,造成内存泄漏
- 内存不能循环使用,造成大量内存碎片
这两个原因会影响我们程序长期平稳的运行,也有可能会导致程序的崩溃;
二、内存池
内存池是池化技术中的一种形式。通常我们在编写程序的时候回使用 new delete 这些关键字来向操作系统申请内存,而这样造成的后果就是每次申请内存和释放内存的时候,都需要和操作系统的系统调用打交道,从堆中分配所需的内存。如果这样的操作太过频繁,就会找成大量的内存碎片进而降低内存的分配性能,甚至出现内存分配失败的情况。
而内存池就是为了解决这个问题而产生的一种技术。从内存分配的概念上看,内存申请无非就是向内存分配方索要一个指针,当向操作系统申请内存时,操作系统需要进行复杂的内存管理调度之后,才能正确的分配出一个相应的指针。而这个分配的过程中,我们还面临着分配失败的风险。
所以,每一次进行内存分配,就会消耗一次分配内存的时间,设这个时间为 T,那么进行 n 次分配总共消耗的时间就是 nT;如果我们一开始就确定好我们可能需要多少内存,那么在最初的时候就分配好这样的一块内存区域,当我们需要内存的时候,直接从这块已经分配好的内存中使用即可,那么总共需要的分配时间仅仅只有 T。当 n 越大时,节约的时间就越多。
---引用来源互联网
三、内存池设计
内存池设计实现中主要分为以下几部分:
- 重载new
- 创建内存节点
- 创建内存池
- 管理内存池
下面,比较详细的来说说设计细节:
重载new就不说了,直接从内存节点开始;
内存池节点
内存池节点需要包含以下几点元素:
- 所属池子(pMem),因为后续在内存池管理中可以直接调用申请内存和释放内存
- 下一个节点(pNext),这里主要是使用链表的思路,将所有的内存块关联起来;
- 节点是否被使用(bUsed),这里保证每次使用前,该节点是没