STL源码剖析之ROUND_UP函数实现原理及其拓展

本文深入探讨了STL中allocator的ROUND_UP函数,详细解释了其基于二进制位运算的实现原理,以及如何计算以特定大小为倍数的上下界数。同时,文章还讨论了当大小不是2的幂时的拓展解决方案。
摘要由CSDN通过智能技术生成

    STL源码allocator的实现中有一个ROUND_UP函数,作用是将非8倍数的整数上调到8的倍数。

// instead of enum { x = N }, but fewcompilers accept the former.
# ifndef__SUNPRO_CC
    enum {__ALIGN = 8};
    enum {__MAX_BYTES = 128};
    enum {__NFREELISTS = __MAX_BYTES/__ALIGN};
# endif
  static size_t ROUND_UP(size_t bytes) {
        return (((bytes) + __ALIGN-1) &~(__ALIGN - 1));
  }

   这里记录一下ROUND_UP函数的实现原理,并考虑相关的拓展情形。

1 原理

    int a; 
    int size = 8;        <----> 1000(bin)

    计算a以size为倍数的下界数:
    就让这个数(要计算的这个数)表示成二进制时,最后三位为0就可以达到这个目标。只要下面这个数与a进行"与运算"就可以了:
    11111111 11111111 11111111 11111000
    而上面这个数实际下就是 ~(size - 1),可以将该数称为size的对齐掩码size_mask. 

    计算a以size为倍数的上下界数:

#define alignment_down(a, size) (a & (~(size-1)) )
#defi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值