实现8字节对齐的mymalloc时应如何处理header适配对齐要求
自定义mymalloc 8字节对齐问题解答
核心结论
你最终需要申请16字节的总内存,核心原因是必须保证返回给用户的payload地址严格符合8字节对齐规则,4字节的header会导致payload地址错位,必须补充填充位。
具体逻辑说明
- C标准要求malloc返回的指针必须适配当前平台所有基础数据类型的对齐要求,你预设的8字节对齐就是要保证payload起始地址是8的整数倍,否则用户用该指针访问
double、uint64_t等8字节类型时会触发未定义行为,部分精简指令集架构会直接抛出硬件异常崩溃。 - 假设你从系统调用(sbrk/mmap)拿到的原始内存起始地址是8字节对齐的(系统返回的内存默认都是至少页对齐,天然满足8字节对齐要求),如果直接把4字节header放在原始地址起始位置,header结束后的地址就是
原始地址+4,模8余4,完全不满足payload的8字节对齐要求。 - 你需要在header后额外加4字节的填充位,让header加填充总占8字节,此时payload的起始地址就变成
原始地址+8,刚好满足8字节对齐。加上你要分配的8字节payload,总占用就是16字节,没有更节约的方案。 - 如果你的header设计包含了内存块大小等必要字段,也可以选择调整header结构直接占8字节,省掉单独处理填充的逻辑,实现起来更简单。
注意:如果你的mymalloc后续要支持空闲块合并、分裂功能,所有操作都要保证新生成的空闲块payload地址始终保持8字节对齐,避免出现分配错位的问题。
内容的提问来源于stack exchange,提问作者Ryan Lee
相关产品推荐
相关产品推荐

