核心结构体分析
malloc_state
Binmap
#define BINMAPSHIFT 5 #define BITSPERMAP (1U << BINMAPSHIFT) #define BINMAPSIZE (NBINS / BITSPERMAP)
#define idx2block(i) ((i) >> BINMAPSHIFT) #define idx2bit(i) ((1U << ((i) & ((1U << BINMAPSHIFT)-1))))
#define mark_bin(m,i) ((m)->binmap[idx2block(i)] |= idx2bit(i)) #define unmark_bin(m,i) ((m)->binmap[idx2block(i)] &= ~(idx2bit(i))) #define get_binmap(m,i) ((m)->binmap[idx2block(i)] & idx2bit(i)
binmap一共128bits,16字节,4个int大小,binmap按int分成4个block,每个block有32个bit。
- idx2block:计算出该 bin 在 binmap 对应的 bit 属于哪个 block
- idx2bit:取第 i 位为1,其他位都为 0 的掩码
- mark_bin:设置第 i 个 bin 在 binmap 中对应的 bit 位为 1
- unmark_bin:设置第 i 个 bin 在 binmap 中对应的 bit 位为 0
- get_binmap:获取第 i 个 bin 在 binmap 中对应的 bit。