向上取整算法
在進行內存分配的時候一般都需要在實際使用內存大小的基礎上進行內存對齊,比如一般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 $$
補充
其實還有一個算法
long(A + B - 1) &~ (B - 1)
也可以計算,但是我沒有弄清楚它的原理是什麽,暫時不管先記住再說^_^
這裏對數學公式的支持不太好,如果想看完整的點擊這裏
向上取整算法