Hasty Briefsbeta

双语

Why malloc always does more than I asked for?

3 days ago
  • 简单的线性分配器通过向前移动游标来工作,但无法释放单个分配。
  • 为了支持 free(),在用户内存之前存储元数据(头部)以记录大小和对齐。
  • 对齐要求导致头部和用户内存之间存在可变填充,使得无法通过简单减法来定位头部。
  • 一个反向指针(存储在用户内存之前的固定偏移处)指向头部,解决了对齐距离问题。
  • 内部碎片化发生,因为元数据和用户内存之间的填充字节被分配但从未使用。
  • 空闲列表(已释放块的链表)实现重用;首次适应搜索找到第一个合适的块。
  • 将大空闲块拆分成小片段可避免浪费内存,但剩余片段必须足够大以容纳自己的元数据。
  • 合并通过同时拥有头部和尾部(块的两端存储大小)来合并相邻的空闲块。
  • 错误通常源于元数据(例如 FreeNode)未对齐,或忘记在每次大小变化时写入尾部。