0
点赞
收藏
分享

微信扫一扫

malloc源码分析(2)--常用的常量

Separes 2022-03-13 阅读 42
linux

文章目录


在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)
举报

相关推荐

0 条评论