两个重要的辅助接口函数
大约 1 分钟
两个重要的辅助接口函数
template <bool threads, int inst>
class __default_alloc_template {
//...
//将 __bytes 上调至最邻近的8的倍数
static size_t
_S_round_up(size_t __bytes) {
return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1));
}
//返回 __bytes 大小的chunk块位于 free-list 中的编号
static size_t _S_freelist_index(size_t __bytes) {
return (( (__bytes) + (size_t)_ALIGN-1) / (size_t)_ALIGN - 1);
}
};
//将 __bytes 上调至最邻近的8的倍数
static size_t
_S_round_up(size_t __bytes) {
return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1));
}
/*
_ALIGN = 8
~((size_t) _ALIGN - 1))
先将_ALIGN转为4字节
00000000 00000000 00000000 00001000
然后减1,取反,最终得到的是一个无符号的大整数
(size_t) _ALIGN-1) => 00000000 00000000 00000000 00000111
~((size_t) _ALIGN - 1) => 11111111 11111111 11111111 11111000
((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)
按位与11111111 11111111 11111111 11111000与,低3位永远为0,但是
基数为7,加1就会进位为8,所以:
1~8 =》8
9~16 =》16
17~24 =》24
...
如果__bytes = 4
00000000 00000000 00000000 00001011 &
11111111 11111111 11111111 11111000 =
00000000 00000000 00000000 00001000 8
*/
//返回 __bytes 大小的chunk块位于 free-list 中的编号
static size_t _S_freelist_index(size_t __bytes) {
return (( (__bytes) + (size_t)_ALIGN-1) / (size_t)_ALIGN - 1);
}
/*
(__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN
(1~8 + 7) / 8 = 1
(9~16 + 7) / 8 = 2
...
((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1得到的是下标
(1~8 + 7) / 8 - 1 = 0
(9~16 + 7) / 8 - 1 = 1
...
*/