491-SGI STL二级空间配置器(重要的辅助接口函数)

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个下标(自由链表的下标)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值