struct malloc_chunk {
INTERNAL_SIZE_T mchunk_prev_size;
INTERNAL_SIZE_T mchunk_size;
struct malloc_chunk* fd;
struct malloc_chunk* bk;
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};
一、成员介绍
每个成员都是8字节(64位系统中),4字节(32位系统中)
mchunk_prev_size、mchunk_size
mchunk_prev_size:只有当该chunk的物理相邻的前一地址chunk是空闲的话,该字段在本chunk中才有用,用来记录前一个chunk 的大小 (包括chunk头)。否则,该字段为0是没有用的;但是当前一个chunk申请的大小大于前一个chunk的大小时,那么该字段可以用来给前一个chunk使用(这就是chunk的空间复用,后面文章介绍)mchunk_size:当前chunk的大小
fd、bk
当前chunk处于分配状态时:
fd:从fd字段开始的是用户的数据
当前chunk处于空闲时:
因为chunk处于空闲时,会被放到bin链中,所以fd和bk用于指向自己所在bin链中前后的空闲chunk
fd:指向前一个(非物理相邻)空闲的 chunk的指针(头指针)bk:指向后一个(非物理相邻)空闲的 chunk的指针通过fd和bk可以将空闲的chunk块加入到空闲的chunk块链表进行统一管理
fd_nextsize、bk_nextsize
也是只有chunk空闲的时候才使用,不过其用于较大的chunk(large chunk)
fd_nextsize:指向前一个与当前 chunk 大小不同的第一个空闲块,不包含bin的头指针bk_nextsize:指向后一个与当前 chunk 大小不同的第一个空闲块,不包含 bin 的头指针
一般空闲的 large chunk 在 fd 的遍历顺序中,按照由大到小的顺序排列。这样做可以避免在寻找合适 chunk 时挨个遍历
二、结构体大小的对齐原则
原则:struct malloc_chunk结构体的大小必须是2 * SIZE_SZ的整数倍。如果申请的内存大小不是2 * SIZE_SZ 的整数倍,会被转换满足大小的最小的2 * SIZE_SZ 的倍数(32位系统中,SIZE_SZ是4;64 位系统中,SIZE_SZ是8)当前chunk结构体的大小用mchunk_size成员的值表示