空间配置器有两个不容易理解的,但是很重要的辅助函数,分别是 _S_round_up和 _S_freelist_index。
_S_round_up
先给出源码:
enum {_ALIGN = 8};
static size_t
_S_round_up(size_t __bytes)
{ return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); }
其作用是:将 数字__byte 上调至最临近的 8 的倍数。
解析:
(size_t) _ALIGN 将_ALIGN(默认为8)强转为4字节无符号整数:
00000000 00000000 00000000 00001000
然后 -1 加上 __bytes。(假设为7):
00000000 00000000 00000000 00001110
~((size_t) _ALIGN - 1)) 通过对 4字节无符号整数 - 1 之后 取反:
11111111 11111111 11111111 11111000
再将两者两者相与:
00000000 00000000 00000000 00001000
即可达到:1-8 => 8, 9-16 =>16, ...
_S_freelist_index
先给出源码:
static size_t _S_freelist_index(size_t __bytes) {
return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1);
}
作用:返回 _bytes 大小的chunk块 位于 _S_free_list 数组 中的编号
解析:
(_bytes + 7) / 8 - 1,最终达到:1-8 =》0, 9-16 => 1, ...