alloctor在早期VC6版的源码实现如下图,用new()和delete()去实现,但根本上说,实际上是包装的malloc和free去实现内存的获取和释放,
这种形式的alloctor由于moalloc()的特点,每次调用,都会去占用一部分内存来去记录诸如每个元素的大小等的“无用信息”,而且是不论多小都会产生无用内存,如果调用次数上去了,无用内存甚至近几倍于实际有用内存。
在这种情形下,GNU2.9的alloctor版本(用在容器里的那个alloc),就专门设计了一个精巧的结构:
它的实际内容是先创建一个从0到16的单向链表,每个链表的内存单元数逐次乘8,第16个(15#)有16*8= 168个内存单元,
然后最关键的是,他直接每次向系统malloc()一大段内存,然后去做分割,这样就避免了多次malloc()带来的许多”无用内存“,虽然这个设计在后来又被改回去了……