std::allocator

发布时间 2023-08-22 11:30:06作者: stu--wy
  • 设计主要目的:减少malloc的cookie的开销
  • 设计主要方法:减少malloc的次数,用数据结构管理已经分配的内存。
  • 核心数据结构:free_list[16]存储16根链表头,free_list[i],0~15 ,free_list[i]管理(i + 1)*16字节型区块。
  • 客户所需要内存块大小会被调整为16的倍数。
  • 流程:分配内存的时候先从战备池里拿,(能切多少就尽量切多少,可以切1~20之间个区块)如果战备池剩余量不足,若有碎片先处理碎片,将碎片挂到16根中的对应那根,然后调用malloc,调用malloc时分配 客户需要的字节数*20*2+RoundUp(RoundUp会增长,内存越要越多),其中分配的一半内存组织成16根链表中的对应那根链表,另一半做战备池。
  • 如果malloc失败,战备池余量也不足一个,那么分配器将会向右寻找最接近分配字节的链表空余中拿一块回填战备池,直至失败。
  • 战备池的实现用两根指针指向start_free end_free。
  • embedded pointers 嵌入式指针,链表借每一个区块的前四个字节作为指针,该区块分配出去之后可以任意修改覆盖前四个字节,该区块回收时,再将该区块的前四个字节作为指针链入链表。