向上取整算法

在进行内存分配的时候一般都需要在实际使用内存大小的基础上进行内存对齐,比如一般32位平台进行4字节对齐,而64位平台使用8字节对齐等等。
一般采用的算法是先利用公式

int(a+b1b)
(其中a是实际使用的内存, b是对齐值)
然后根据这个值乘以b即可得到对应的对齐值

公式推导

A=NB+M(M[0,B1])

AB=N+MB

M[0,B1]

ABNB+B1BA+B1B

从上面可以得出 AB 向上取整可能是int( A+B1B )但是具体是否有比它小的整数,仍然不能确定.因此我们根据推导一下这个结果与 AB 向上取整的结果是否相同

A=NB+M(M[0,B1])

M=0UP(AB)=N

M0UP(AB)=N

而针对int( A+B1B )的结果

M=0int(A+B1B)=int(NB+B1B)=int(N+11B)

1B<1

int(A+B1B)

M0int(A+B1B)=int(NB+M+B1B)=int(N+1+M1B)

M=1int(A+B1B)=int(N+1+M1B)=N+1

1<MB1M1B<1

int(A+B1B)=int(N+1+M1B)=N

从上面的推导来看二者的值完全相同所以可以得出结论

UP(AB)=int(A+B1B)

所以当我们对A字节的内存进行B字节的对齐时可以使用公式

int(A+B1B)×B

补充

其实还有一个算法

long(A + B - 1) &~ (B - 1)

也可以计算,但是我没有弄清楚它的原理是什么,暂时不管先记住再说^_^

猜你喜欢

转载自blog.csdn.net/lanuage/article/details/78746606