向上取整算法

在进行内存分配的时候一般都需要在实际使用内存大小的基础上进行内存对齐,比如一般32位平台进行4字节对齐,而64位平台使用8字节对齐等等。
一般采用的算法是先利用公式
$$int(\frac{a + b - 1} { b})$$(其中a是实际使用的内存, b是对齐值)
然后根据这个值乘以b即可得到对应的对齐值

公式推导

$$ 假设 A = NB +M (M \in \left[0,B-1\right])$$
$$\because\frac{A}{B} = N + \frac{M}{B}$$
$$\because M \in\left[0, B-1\right]$$
$$\therefore \frac{A}{B} \leq \frac{NB +B -1}{B} \leq \frac{A + B -1}{B}$$
从上面可以得出$$\frac{A}{B}$$向上取整可能是$$int(\frac{A+B-1}{B})$$但是具体是否有比它小的整数,仍然不能确定.因此我们根据推导一下这个结果与$$\frac{A}{B}$$向上取整的结果是否相同
$$ 假设 A = NB +M (M \in \left[0,B-1\right])$$
$$当M = 0时UP(\frac{A}{B}) = N$$
$$当M \neq 0时,UP(\frac{A}{B}) = N$$
而针对$$int(\frac{A+B-1}{B})$$的结果
$$当M = 0时int(\frac{A+B-1}{B} )=int(\frac{NB+B -1}{B}) = int(N + 1 - \frac{1}{B}) $$
$$\because \frac{1}{B} < 1$$
$$\therefore int(\frac{A+B-1}{B} )$$
$$当 M \neq 0 时int(\frac{A+B-1}{B} ) = int(\frac{NB +M + B -1}{B}) = int(N + 1 + \frac{M-1}{B})$$
$$当M = 1时 int(\frac{A+B-1}{B} ) = int(N + 1 + \frac{M-1}{B}) = N + 1$$
$$当1 < M \leq B-1时 \frac{M -1}{B} < 1$$
$$\therefore int(\frac{A+B-1}{B} ) = int(N + 1 + \frac{M-1}{B}) = N$$
从上面的推导来看二者的值完全相同所以可以得出结论
$$UP(\frac{A}{B}) = int(\frac{A + B - 1}{B})$$
所以当我们对A字节的内存进行B字节的对齐时可以使用公式
$$int(\frac{A + B - 1}{B}) \times B $$

补充

其实还有一个算法

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

也可以计算,但是我没有弄清楚它的原理是什么,暂时不管先记住再说^_^
PS:不知道怎么把公式居左对齐,这样比较难看,但是暂时没什么好办法,就这样吧T_T