STL的内存池的设计源码分析和体会

来源:互联网 发布:2017淘宝双十一规则 编辑:程序博客网 时间:2024/04/29 07:31

   在一些 服务器端程序设计的时候, 在申请内存 一般要用到内存池。 避免频繁的申请内存 带来的效率问题,

STL源码的 内存池 设计的是128个字节以内 有从内存池子里面去取,但是大于128 个字节了 直接去 malloc 了。

      其实倒可以 去借鉴STL的源码  设计出 更满足实际需求的 内存池, 因为在实战中 可能大于128个字节,这要根据具体的数据结构去变化。

     STL  在申请内存的时候 做了两级过滤,要是如果用户申请的内存小于128个字节,直接将申请的字节调整为 8的整数倍, 然后从其中去取。

    到底是个怎样的情况呢  就是一个数组,  这个数组 每个元素 存放一个指针, 指向实际的内存。

         STL里面是16个。  从第一个开始 分别管理的8个字节 16 个字节,32 个字节... 那么第16个 自然是16*8 = 128了哦。  

    假设 内存池是 free_list[16];  那么free_list[0]存放的是 8个字节内存的首地址。  然后这个八个字节  指针域 指向 下一个8个字节的内存, 在默认状态下是20个这样的内存 连在一起的。

   STL 在设计 这个区域的数据机构的时候用了联合union,  这个举动相当有才。 如果用结构体的话,  每个空闲链表都要多加四个字节的指针来存放, 实在不脱 ,不好安排。

         union obj

{

                       union obj *  next;

                       //数据

                    ......

};

         酱紫就避免了浪费 也好处理。

    下次写文章 附上  实例代码。

0 0