c++语法中动态分配和指针/引用的使用非常普遍,然而缺省的自由存储区分配器(比如::operator new和::operator delete)只适用于大对象对分配,对小对象分配并不有效,甚至非常低劣,多次分配小对象后容易产生碎片。
小型对象分配器
小型对象分配器分为4层结构。如图所示,下层提供功能供上层使用。
+-------------------+
| SmallObject |
+-------------------+
| SmallObjAllocator |
+-------------------+
| FixedAllocator |
+-------------------+
| Chunk |
+-------------------+
最下层是Chunk对象,每一个Chunk管理一大块内存,此大块内存包含整数个固定大小的区块。可以用来分配和归还,当其中没有剩余时,分配失败返回零。
第二层是FixAllocator class,其以Chunk为构件。主要用来满足那些“累计总量超过Chunk容量”的请求。FixAllocator通过一个array(实际是vector)组合Chunks。如果所有Chunk都被使用,FixAllocator分配新Chunk,并加入array,来满足需求。
第三层是SmallObjectAllocator提供通用分配/归还函数。拥有数个FixedAllocator对象,每个负责分配某特定大小对象。根据申请bytes个数不同,SmallObjAllocator对象会将内存分配申请分发。如果请求量过大,会转交系统new。
第四层是SmallObject,它包装FixedAllocator,以便向C++ classes提供封装良好的分配服务。SmallObject重载new和delete。你只需要让你的对象派生于SmallObject。