里面的联合体指针就是指向下一个节点的指针,那个char是指向实际内存块的指针,采用联合体可以减少内存的消耗,不必专门维护一个指向下一个节点的指针
当节点所指的内存块是空闲块时,obj被看做一个指针,指向下一个节点,当节点已经被分配了内存之后,被视为一个指针,指向实际区块
当分配函数allocate()(alloc中申请内存的函数)发现没有可用的区块之后,就会去内存池中申请新的区块(调用chunk_alloc()函数) ,默认申请20个区块,当内存池的可用内存不足20个区块,有多少给多少,如果连一个区块的内存都不够,就往内存池中注入内存(就是再去开辟一些放进内存池里),就会去free_lists中遍历,寻找内存池分配给自由链表但是却处于空闲状态的节点,将这些节点的存储空间归还个内存池,再递归去使用chunk_alloc()函数判断是否空间够分配;如果很不幸,还是不够用,那么注意!!会将内存池中剩余的小空间分配成低位区块分给自由链表(就是说假如需要申请16个字节的节点区块,不够了,但是内存池中有8个字节的空间,当然不能够浪费咯,赶紧分配出去)然后去往内存池中注入内存(就是再去开辟一些放进内存池里)。
这个是《STL源码剖析》里的一个例子
当整个系统堆得内存都不够了的时候,就chunk_malloc()就会四处寻找可用内存,尝试释放一些没用的空间,如果还是无法找到就去调用第一级配置器,因为一级配置器里有内存不足处理例程