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