内存池技术(C实现)

Posted 量化日志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存池技术(C实现)相关的知识,希望对你有一定的参考价值。

            有一周左右的时间没有发推文了,小编最近转向api的二次封装,以更加高效地进行策略的研究与实盘,各中的酸甜苦辣哈哈,小编基于c/c++的api接口进行二次封装,实现个性化的定制,小编不才,仅当开发过程的总结,让大牛见笑了。


            在编程中,为了避免由于频繁的malloc/free产生内存碎片及性能的下降,通常会在程序中实现自己的内存管理模块,即内存池。内存池的原理:程序启动时为内存池申请一块较大的内存,在程序中使用内存时,都由内存池进行分配,不再使用的内存交给内存池回收,用于再次分配。本文参考改进了一个简单的固定大小内存池,仅为demo版,供学习交流,也给自己的成长留下厚厚的印记。


Memory_Pool.h

memory_pool:内存池属性结构,用于整个内存池的管理;

memory_map_table:内存映射表,是内存块的映射,用于管理内存块;

memory_alloc_table:内存分配表,用于记录单次内存块分配信息;

memory:实际用于分配的内存,分配以块为单位,不足一块的按一块处理;

内存池技术(C实现)


Memory_pool.c

        主要实现了四个主要接口:

            memory_pool_init;

            memory_pool_malloc;

            memory_pool_free;

            memory_pool_destroy;

内存池技术(C实现)

内存池技术(C实现)

内存池技术(C实现)


后续思考

            本文的内存池为固定内存池,所谓固定内存池是指应用程序每次从内存池中分配出来的内存块大小事先已经确定,是固定不变的;而可变内存池则每次分配的内存块大小可以按需变化,应用范围更广,而性能比固定内存池要低。

            该内存池申请内存空间,入参为字节数,假如用户申请的是平安银行一段时间的dailybar的close数据,用户并不知道所占字节数为多少,为此,中间尚需一些转换运算,实现量身定制地申请“恰到好处”的内存空间,不能出现内存越界错误。何谓内存访问越界,也就是你向系统申请了一块内存,但是在使用过程中,超出了你申请的范围。

            申请成功后,memory_pool_malloc函数返回的是void*型指针,在获得指针指向的内存空间后,切记应该进行相应的指针类型转换,这样对指针的位移操作才能取到正确的数据。

            在内存块回收部分,应该遵循怎样的规则进行适时回收也是个问题,小编觉得,若用户向内存池申请内存时,若内存池已用满,此时全部回收后再分配内存空间,比较简单粗暴哈哈。

            目前的计算机主要都是采用按字节编址的方式,可以看下源码中的这句代码,其充分体现了这一原则。


   

            


以上是关于内存池技术(C实现)的主要内容,如果未能解决你的问题,请参考以下文章

转 内存池技术的原理与实现

内存池技术畅想

高并发内存池详解(C/C++/Windows/Linux)

高并发内存池详解(C/C++/Windows/Linux)

实现高并发内存池

实现高并发内存池