2个重要的辅助接口函数
_S_round_up 函数分析
_S_round_up通过容器的空间配置器开辟内存的时候,对申请的字节大小进行封装,上调至最邻近的8的倍数
ALIGN先进行类型强转 ALIGN-1,就是8-1=7,二进制就是0111,然后再进行个按位取反~,就是1000,实际上它是先把ALIGN转成unsignedint 4字节的,很重要。
转成4字节后的按位取反:
调整成4字节的,然后希望在按位与的时候,把某个位置为1的元素留下来,所以高位的底下全是1。
我们测试看看:
那么它是如何把1-8–映射》8?
9-16–映射》16?
我们通过代码分析分析,如果这个bytes是0的话,执行表达式后的结果还是0
上下2个二进制按位与:都为0
如果我们是申请1-8字节之间的内存
如果原来是7,+1变成8,就进位了!
不管是1000还是1111 下标的那3位都是0, 按位与,只能把高1位的那个1保留下来。
我们现在申请15 如下:
15再往上走1个,16,就进位了:
按位与,第5位保证为1:
bytes变为17的时候就是如下 对齐到24:16+8 以8字节递增。
_S_freelist_index 函数分析
在基于自由链表的内存池当中,当我们想申请内存的时候,我们得需要知道从哪个自由链表的内存块中申请。
当我们容器想分配内存的时候,或者归还内存的时候,得知道内存对应于自由链表数组的哪个元素位。
这个函数_S_freelist_index就做这个事情。
比如说我们要申请1个字节的内存
1+8-1 =8 8/8=1 1-1=0
在0下标位置,也就是8个字节为大小的chunk块分配:
1-8都是会定位到0下标位置
这个函数就是返回1个下标(自由链表的下标)