malloc堆内存底层分配机制及不同申请大小对应差值问题咨询
malloc堆内存分配差值问题解答
这是64位Linux系统下glibc默认的malloc实现(ptmalloc)的内存对齐+元数据预留规则导致的,具体逻辑如下:
- 首先明确ptmalloc的两个核心规则:
- 所有堆内存块(chunk)的总占用大小必须是16字节的整数倍,满足SIMD指令等场景的16字节对齐要求
- 每个已分配的chunk会预留8字节存储自身块长度的元数据,且已分配状态下前一个块的空闲标记字段可被当前块复用,无需额外占用空间
- 分档位匹配你的三个问题:
- 申请1~24字节内存时:用户申请大小 + 8字节元数据 = 9~32字节,向上取最近的16字节倍数就是32字节,即单个chunk总占用32字节,因此两次连续分配的地址差为32字节
- 申请25~40字节内存时:用户申请大小 +8字节元数据=33~48字节,向上取最近的16字节倍数就是48字节,因此两次分配地址差为48字节
- 申请41~56字节内存时:用户申请大小 +8字节元数据=49~64字节,向上取最近的16字节倍数就是64字节,因此两次分配地址差为64字节
- 补充说明:
这个行为仅对应64位Linux下glibc的默认ptmalloc实现,32位系统、其他malloc实现(如tcmalloc、jemalloc)的分配规则会有差异,运行结果也会不同。
内容的提问来源于stack exchange,提问作者mohammed yaqub
相关产品推荐
相关产品推荐

