携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
最简单的内存分配器
优点 :实现简单
缺点:分配时搜索合适的内存块效率低,释放回归内存后归并比较消耗大
要解决前面两个问题,最好的方法就是内存池技术。具体方法就是大小固定、提前申请、重复利用。
因为内存的申请和释放是很低效的,所以我们只在开始时申请一块大的内存(在该块内存不够用时在二次分配),然后每次需要时都从这块内存中取出,并标记下这块内存被用了,释放时标记此内存被释放了。释放时,并不真的把内存释放给操作系统,只要在一大块内存都空闲的时候,才释放给操作系统。这样,就减少了new/delete的操作次数,从而提高了效率。在调用内存分配函数的时候,大部分时间所分配的内存大小都是一定的,所以可以采用每次都分配固定大小的内存块,这样就避免了内存碎片产生的可能。
如图,mempool是一个内存池类,pBlock指向一个内存块。nUintSzie是分配单元的大小,可以理解为一张image的大小。nInitSize是第一次申请内存的大小,可以理解为申请几张临时image。nGrouSize是后面二次向系统申请的内存的大小。
Memoryblock是一个内存块类,两部分构成,一部分是类的大小,另一部分则是实际的内存部分。nSize代码该内存池块的大小,可以理解为改内存块可以放几张图。nFree是空闲内存单元的个数,nFirst代表的是下一个要分配的内存单元的序号。