今天遇到了一个有意思的问题:ptmalloc内存分配机制是数组+链表管理的,而SGI STL的二级空间适配器同样是数组+链表管理方式,那么有了malloc的ptmalloc的机制,为什么不直接用呢?为什么还要有二级空间配置器这东西存在呢???
个人理解:
先从空间配置器入手,空间配置器将new的操作细分:
1.先申请空间,
2.在申请的空间上调用构造函数
(为什么要将这两步拆分,之前的博客有讲到,不多赘述)
那么提供申请空间的api就是malloc,而malloc底层用到的ptmalloc的机制是对于小内存块先申请,不用时再放到链表中,空闲链表并不是一开始就建立好的。因此,如果我要不停申请新的小内存块,依然需要不断调用malloc。
但是,二级空间配置器不是这样的,它在第一次refill内存池的时候,是调用malloc,申请类对象*20(默认20个)的大小,将剩下的内存分割,头插到对应的free_list上,那么,我再次调用二级空间配置器的时候,不需要再次调用malloc,直接将剩下的对应free_list下的第一个内存块返回给用户,在调整一下就好了。
空间配置器不用频繁的系统调用,从而节约了时间,提高了效率。