在了解了分配器的进化过程之后,我们就进入了这个进化过程的终极一步:全局分配器。
全局分配器就是想通过“大块切小块”的管理方式,来减少malloc的次数从而减少cookie
全局分配器为了具有更好地适配性,通过管理16条链表来管理不同大小地内存分配。
这就是我们接下来讨论的重点。
不同编译器下的allocator实现
首先,我们来看看常见的几个编译器中,内存分配的实现。
VC6
VC6中的malloc在申请空间时的布局如下:
可以看到增加了cookie,debug header等内容,这也就是前面所说的在堆上分配内存时的情况。
VC6中也有标准分配器std::allocator,但看到源码后就会发现,其本质是调用了全局的operator_new()和operator_delete(),也就是调用了malloc和free,没有特殊设计。