关于内存池
这段时间一直在研究图像处理,在图像处理的过程中,免不了的会把图像的数据在内存中拷来拷去,相互比较、印证,所以理所当
然的要经常的用malloc,realloc,free来操作内存。用在一两处地方的时候觉得还无所谓,自己还能记得住,忘不了最后要free一下
,可是几乎每步处理都牵扯到内存分配,那就难免有点晕了。于是开始考虑用内存池来处理频繁的内存分配操作。
先后参考了几个内存分配算法,包括云风的那个,感觉都不太适合我现在做的东西。因为我做的东西基本上成型了,里面有大量的
内存操作,所以我不想把自己已有的代码改动太大,这是原因之一;第二,我做的东西里面对分配的内存的大小没有统一的标准,
有的地方仅仅需要几十个字节大小,有的地方可能需要上MB的空间(有的位图非常大)。而研究过的几个内存池的实现,要么太过
复杂,需要我把原来代码大量修改已适应这个内存池的算法;要么只是在分配比较小的内存空间上有优势,或者只能分配定常内存
。
自己总结了一下自己的需求,其实很简单,我当初想用这个的目的仅仅是为了保证自己在程序退出的时候检查一下自己分配的内存
是否都已经被释放了,用不到太复杂的功能。于是,我就想做一个链表,记录每次自己分配的内存地址(实现自己的内存分配方法
,调用malloc,realloc,在分配成功后把这个保存内存分配的地址的变量的地址记录在链表中);在释放的时候调用自己的内存释
放方法,对这个地址进行释放,记录状态。在程序结束后,遍历这个链表,把这个链表上的未释放的内存释放掉即可。
================================================================
对能分配任意大小的内存的内存池的想法
现在看,支持分配任意大小内存的做法,简单的一种就是先初始化一块大内存,所有内存分配都在这里面进行。如果这块内存不够
用了,就重新realloc一下,请求更大的内存,然后再进行分配。这种做法对需求小的操作还可以,如果是大量的大容量的内存分配
请求,则可能到这这个内存池所需的内存越来越大,频繁的realloc,反而会降低效率。
还有一种就是采用分页分段的方法,取固定大小的内存为一页,每一页上再按照一定大小进行分段。如果所需内存不超过一页,则
在页内进行分配,分配的内存大小应该是段的整数倍,剩余空间记录到未分配的记录链表中;如果超过一页大小则再增加新的页(
可能是多页)。通过未分配记录链表按照一定的算法进行内存分配,这样可以避免出现超大内存块的现象,但是实现起来复杂度很
高,而且对分配的内存的操作也不如连续内存空间方便(可考虑用C++实现,重载[]操作符,还可以实现边界安全检查)。