说明:
本文是在网上查看了相关技术课题及解说后做的一个笔记与摘录,关键在于描述这么一种思想。
经典的内存池(Memory pool)技术是获取及释放相同大小的内存块单元对象的技术,其优点在于快速获取内存以及快速释放内存。
经典内存池技术通常需要四个变量外部变量来管理内存单元,分别是内存块大小(总的内存块),最小内存块大小(由于指针等关系,一般要求最小内存块单元大于sizeof(void*)个字节,即4个字节),一个指向内存块首地址的指针和一个指向空闲内存块首地址的指针。具体实现结构如下:
1class MemeoryPool
2 }
此处实现的内存池技术采用的是定长的最小块单元,是一个功能比较简单的内存块实现单元。
性能分析:
此处获取内存,除了第一次需要调用new操作以及设置指针等操作,花费较多时间,new操作需要调用系统功能,花费时间较大,指针初始化操作也需要花费较长时间,但其后每次申请内存单元的复杂度均为O(1),析构内存单元的复杂度也为O(1),因此与直接申请内存相比,内存池技术对内存的申请以及释放均有较快的速度,并且,由于内存池一次性申请是一大块内存(否则就不能称之为池了),将减少系统中的内存碎片。当然由于内存池技术需要额外的指针来指示内存单元的使用情况,因此,内存池技术对于少量内存使用的程序其空间利用率是比较低的。A coin has two faces!
在stl设计中,大量使用了内存池技术(采用new以及new placement技术来实现),通过allocator类封装来实现,模板技术可以方便的获取最小内存对象块的大小,设定内存单元块数目就可以知道m_nMemBlockSize的大小了,而且可以动态改变。
上述的内存池技术中采用的是定长的内存单元块申请,对于需要大量内存单元的程序,该方式所能够提供的节省时间将减少,为了使得程序能够节省更多时间,采用具有动态申请内存(从系统中)的方法,即第一次申请1KB,第二次申请2KB,第三次申请4KB,第四次申请8KB,在需要大内存单元的时候,程序依然可以节省大量大量时间。由于该方法在计算机中广泛使用,便有了一个名字:预测模型。stl中vector便是采用预测模型来实现的。
相关文章: