SGI_STL空间配置器源码剖析(二)辅助接口函数

空间配置器有两个不容易理解的,但是很重要的辅助函数,分别是 _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, ...

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值