MicroAlloc2 months agohttps://bogdanthegeek.github.io/blog/projects/microalloc/作者通过研究ESP-IDF堆分配器,创建了一个自定义内存分配器(MicroAlloc)。通用堆分配器需要在速度、开销和碎片化之间进行权衡。该实现采用首次适应空闲链表分配器,其元数据结构存储偏移量而非完整指针,以最小化开销(每个分配仅2字节)。嵌入式工程师通常应避免动态分配;静态分配、暂存缓冲区、块分配器和区域分配器是更安全的选择。Free()实现包含合并相邻空闲块的功能,但可通过编译时标志延迟合并以获得更佳性能。
Why malloc always does more than I asked for?3 months agohttps://ssenthilnathan3.github.io/blog/malloc/简单的线性分配器通过向前移动游标来工作,但无法释放单个分配。为了支持 free(),在用户内存之前存储元数据(头部)以记录大小和对齐。对齐要求导致头部和用户内存之间存在可变填充,使得无法通过简单减法来定位头部。一个反向指针(存储在用户内存之前的固定偏移处)指向头部,解决了对齐距离问题。内部碎片化发生,因为元数据和用户内存之间的填充字节被分配但从未使用。空闲列表(已释放块的链表)实现重用;首次适应搜索找到第一个合适的块。将大空闲块拆分成小片段可避免浪费内存,但剩余片段必须足够大以容纳自己的元数据。合并通过同时拥有头部和尾部(块的两端存储大小)来合并相邻的空闲块。错误通常源于元数据(例如 FreeNode)未对齐,或忘记在每次大小变化时写入尾部。