我很愿意在小对象的分配策略这里花很多时间,因为之处在这里也有很多疑问。
我也很伤感“我的大脑没有版本回溯”,无法和你分享我在弄明白这个问题前的痛苦和弄明白这个问题那一刻的思维方式。但我尝试尽量回忆,这于小对象有关,与其他东西无关,但是思考问题方法和你以后可能遇到的很多东西有关。
小对象分配策略分成了四层,Chunk、FixedAllocator、SmallObjAllocator和SmallObject,各层各负其责,底层绝对不考虑上层的东西,所以只见树木不见森林的学习方法会碰到很多疑惑,譬如为何以固定大小的分配器可以分配任意大小的内存块的问题。
但是,功能的严格划分保证了问题的简化、代码的简洁,在这里也给我们提供了不错的效率。
理解Loki小对象分配需要从全局着眼,先明白结构原理而后看细节会少走不少弯路,从某种意义上来说由顶而下的分析方法也会促使问题早日解决。另外,自己的想法很重要,学会去学一个思想而不是拾废纸片。
SmallObject提供了operator new和operator delete,使得内存分配可以使用我们的策略而不是系统的new和delete。
SmallObjAllocator提供了各种大小的内存块的一个集合,任意大小的内存分配都可以在集合中找到自己。
FixedAllocator只可以分配特定blockSize大小的内存块,但是从1到maxBlockSize得一个FixedAllocator集合可以满足所有内存分配请求。FixedAllocator着眼大块内存的管理,这个大指的是无限大,它可以被无限扩充,从这个层面上来说它不适合再做细节分配的工作。
Chunk是固定大小内存块的组合,只不过总内存块数不多,这方便了它的管理,也和FixedAllocator得功能分开。它着眼于自己管理下的特定一块内存的提取和归还。
MemControlBlock是Chunk管理的特定的一块内存,你可以理解为它是系统new函数时的char级内存,它是最小单元,你不可能分配比MemControlBlock更小的内存块。