内存池

来源:互联网 发布:截图软件电脑版 编辑:程序博客网 时间:2024/06/03 12:23
内存池是为了快速高效的内存利用,提高程序效率,降低内存开辟和删除过程,减少内存碎片,降低申请内存失败等情况;


内存池一般是开辟堆上的空间;




思路有两种:
思路一:链表环形内存池,可以动态增减;




思路二: 申请一个巨大的内存,然后分段应用;亦可根据实际增减;
这里的增减可以用两种方式:
(1):可以用malloc和remalloc等C语言函数实现,这样的好处是之前指定的指针位置不会变化;
(2):如要申请的内存已经超出现有的内存池中内存的大小,可以重新申请一块更大的内存(现有内存池大小 + 新申请的内存大小),然后将内存池中的内存复制到新的内存中,然后新内存多出的空间中处理新的数据;




上述两个方法都可以实现内存池,但是个有缺点;
思路一的缺点:就是申请的内存每一块大小都是固定的,用过的内存返回到内存池(可以用标记记录是否已经申请);
但是如果要再次申请,那么,如果申请的size大于现有内存池中现有节点大小,就要重新申请;
如果size小于内存池中Node的size,那么就会造成浪费;
而且申请的size只要不同于内存池中Node的size在编写代码的时候也比较麻烦,而且增加内存再次申请开辟的次数,这样就降低了内存池的效率;


思路一的方法,比较适合于固定内存大小的程序应用,例如,视频图像存储,每次的图像大小一样,所以可以内存池先创建一定大小,存储图像,图像来得快就先放到内存池中,处理完成后放回内存池;






第二个的缺点,就是申请的是一块连续的内存空间,如果需要的控件不断的增加,有可能会申请失败; 当然这样也同样会产生内存池中的内存碎片;
思路二的方法,比较适合于每次内存每次大小不固定的情况;每次的数据量也不要太大,或者太多;
0 0
原创粉丝点击