一个高效的固定大小内存池管理算法

这两天,在改一个既有程序的内存池管理算法,原有的管理算法基于固定内存最大块管理,块的尺寸固定为最大可利用内存大小,在大部分的情况下内存利用率非常低。

为此打算找一个高速的内存利用率高的算法。先是看了看FastMM,代码太复杂,使用了太多的汇编语言,过于庞大,接近8000行代码。于是放弃,找来找去,发现sqlite的内存池管理算法还是挺牛叉的。它是基于二分策略的,每一个内存块的大小是2的指数。

内存池初始化:

     内存Block1Block2 .... Block N 
大小  2         2^2     ....  2^n    

内存分配·:

例: 分配34Byte、34=2^5+2 ,搜索Block大小是2的6次方的Block,如果没有使用就使用。

     内存Block5 Block6 .... Block N 
大小  2^5         2^6     ....  2^n    
                         ↑(若未使用,就是用)

如果2的6次方Block已使用,则找到2的7次方块,将其等分后使用分割后的2的6次方。
     内存Block6 Block7 .... Block N 
大小  2^6         2^7     ....  2^n    
          ↑(使用)     ↑(分割成2块)

如果2的7次方块也已使用,则依次类推,寻找下一个大的未使用的块,并分割使用。

这个方法的好处是
1.内存利用率高,理论最小内存利用率是2^(n-1)+1/2^n,总是大于50%。
2.内存分配时,内存块不需要移动,速度非常快,同时不会产生内存碎块,稳定性很好,适合做游戏开发,呵呵。