fastbin相关
fastbinsY数组其实并没有保存头结点,而是只保存了malloc_chunk的fd成员,因为其他成员对于单链表头结点并没有用,所以就省略了。如下图所示,这些fd指针的初始值为NULL,表示对应的bin为空,直到有chunk加进来时,fd才保存chunk的地址。
?FASTBIN_CONSOLIDATION_THRESHOLD,fastbin中的chunk一般不会与其他chunk合并。但如果合并之后的chunk大于FASTBIN_CONSOLIDATION_THRESHOLD,就会触发malloc_consolidate()函数,将fastbin中的chunk与其他free chunk合并,然后移动到unsorted bin中。
? fast bin中最大的chunk是由global_max_fast决定的,这个值一般在堆初始化的时候设置。当然在运行时也是可以设置的。
bins相关
可以看到binat(m,i)宏定义中减去了offsetof (struct malloc_chunk, fd),也就是prev_size和size成员的大小。这是因为bins数组实际上只保存了双链表的头结点的fd和bk指针,如下图所示。
bins[0]和bins[1]是unsorted bin的fd和bk指针,binat(1)返回的应该是unsorted bin的头指针,但实际上其指向的是bins[0]地址减去offsetof (struct malloc_chunk, fd)的位置,这样使用头结点指针b时,b->fd或者b->bk能够正确访问,同时prev_size和size对于头结点没有意义,所以就被省略了。对于binat(64)及之后的large bin来说,因为头结点的size成员没有意义,所以其fd_nextsize和bk_nextsize也是没有意义的,也可以省略。
small bin和large bin索引如下。
获得unsorted bin。
binmap结构在索引bin的时候使用,binmap为malloc_state的成员,其中一个比特位表示bins中相应的bin的状态,1表示bin不为空,0表示为空,这样能加快搜索速度。
| 留言与评论(共有 0 条评论) “” |