文章目录
在glibc源码学习里面有时候会遇见一些#define ,当我们先大概知道一些会在调试的时候更轻松
[未完待续]
SIZE_SZ
这个其实就是用来判断你当前运行环境是32位还是64位的,变化的长度
32位是4
64位是8
#define INTERNAL_SIZE_T size_t
#define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
SIZE_SZ 相当于就是size_t的大小,在64位上就是8
所以我们相当于
#define SIZE_SZ 8
DEFAULT_MXFAST
这个是默认的fastbin的最大大小
#define DEFAULT_MXFAST (64 * SIZE_SZ / 4)
有了前面的定义,这里就是
#define DEFAULT_MXFAST 128
所以一般fastbin默认最大小就是0x80
get_max_fast
static INTERNAL_SIZE_T global_max_fast;
#define get_max_fast() global_max_fast
最开始没有初始化的时候其实global_max_fast为0
当我们跟malloc的时候有一步骤是初始化global_max_fast
他调用了
set_max_fast(DEFAULT_MXFAST)
#define set_max_fast(s) \
global_max_fast = (((s) == 0) \
? SMALLBIN_WIDTH : ((s + SIZE_SZ) & ~MALLOC_ALIGN_MASK))
这个时候相当于是
global_max_fast=( (s + SIZE_SZ) & ~15))
也就是(s+8)&(~0B1111)
相当于低4位全部清0
这里其实最后结果还是128
所以当初始化后
#define get_max_fast() 0x80
MALLOC_ALIGN_MASK
我们这里涉及到了太多的操作
我们就直接在64位机器上实验
alignof (long double)=16
# define MALLOC_ALIGNMENT (2 *SIZE_SZ < __alignof__ (long double) \
? __alignof__ (long double) : 2 *SIZE_SZ)
# else
# define MALLOC_ALIGNMENT (2 *SIZE_SZ)
# endif
#endif
#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
相当于是
# define MALLOC_ALIGNMENT (2 *SIZE_SZ < 16 \
? __alignof__ (long double) : 2 *SIZE_SZ)
# else
# define MALLOC_ALIGNMENT (2 *SIZE_SZ)
# endif
#endif
所以可以看见结果就是
# define MALLOC_ALIGNMENT 16
#define MALLOC_ALIGN_MASK 15
NBINS
这个是bins的所有大小,包括small bin和largen bin
#define NBINS 128
NSMALLBINS
smallbins的数量
#define NSMALLBINS 64
MIN_LARGE_SIZE
#define SMALLBIN_WIDTH MALLOC_ALIGNMENT
#define SMALLBIN_CORRECTION (MALLOC_ALIGNMENT > 2 * SIZE_SZ)
#define MIN_LARGE_SIZE ((NSMALLBINS - SMALLBIN_CORRECTION) * SMALLBIN_WIDTH)
也就是
#define SMALLBIN_WIDTH 16
#define SMALLBIN_CORRECTION 0
#define MIN_LARGE_SIZE 0x400
也就是说最小的large bin是0x400,最大的small bin不超过0x400
in_smallbin_range
即
#define in_smallbin_range(sz) \
((unsigned long) (sz) < (unsigned long) MIN_LARGE_SIZE)
#define in_smallbin_range(sz) \
((unsigned long) (sz) < 0x400)