我是靠谱客的博主 热心小海豚,最近开发中收集的这篇文章主要介绍STL源码剖析之ROUND_UP函数实现原理及其拓展,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    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)) )
#define alignment_up(a, size)   ((a+size-1) & (~ (size-1)))

    注: 上界数的计算方法,如果要求出比a大的是不是需要加上8就可以了?可是如果a本身就是8的倍数,这样加8不就错了吗,所以        在a基础上加上(size - 1), 然后与size的对齐掩码进行与运算.

    例如:
    a=0, size=8, 则alignment_down(a,size)=0, alignment_up(a,size)=0.
    a=6, size=8, 则alignment_down(a,size)=0, alignment_up(a,size)=8.
    a=8, size=8, 则alignment_down(a,size)=8, alignment_up(a,size)=8.
    a=14, size=8,则alignment_down(a,size)=8, alignment_up(a,size)=16.
    注:size应当为2的n次方, 即2, 4, 8, 16, 32, 64, 128, 256, 1024, 2048, 4096 ...

2 拓展

    如果size不是2的幂,则不能采用位运算的方法,可以采用普通的十进制方法。

size_t round_low(size_t x, size_t N) {
	return x - (x% N);
}
size_t round_up(size_t x,size_t N) {
	return (x + N - 1) - ((x + N - 1) % N);
}

 

转载于:https://www.cnblogs.com/muyangshaonian/p/9650474.html

最后

以上就是热心小海豚为你收集整理的STL源码剖析之ROUND_UP函数实现原理及其拓展的全部内容,希望文章能够帮你解决STL源码剖析之ROUND_UP函数实现原理及其拓展所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部