向上取整算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lanuage/article/details/78746606

在进行内存分配的时候一般都需要在实际使用内存大小的基础上进行内存对齐,比如一般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)

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

展开阅读全文

没有更多推荐了,返回首页