sgi stl 双层级配置器:
一级配置器:1、直接使用malloc()、ralloc()和free();
2、因为并非使用::operator new 来配置内存,实现了类似c++ new handler的机制(__malloc_alloc_oom_handler、set_malloc_handler);
3、至于为什么不使用new,侯捷的stl源码剖析提到的两个猜想,一是历史原因,二是c++没用提供realloc()的操作;
二级配置器:1、分两组情况,当配置快块大于128bytes,调用一级配置器,当配置块小于128bytes时候采用内存池的整理方式,避免小区块造成内存碎片 ;
2、 free_lists节点结构:
union obj{
union obj* free_list_link;
char client_date[1];
}
union的特性确保了不会为了维护链表所必须的指针而造成内存浪费;
第一个字段指向相同类型的obj,第二个字段指向实际区块;
3、位运算,好吧,我不太会用,sgi二级配置器会将小区块的内存需求量上调到8的倍数,实现是这样的:return( ((bytes)+__ALIGN-1) & ~(__ALIGN-1) ); ;