#define ngx_align_ptr(p, a) \
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
上面式子,當a等於2的冪的時候,比如,4,8,16等值時,
d加上(a-1) 之後的值肯定要比最小的a的倍數要大的。因爲a爲2的冪,所以(a - 1) 剛好後面幾位都是連續的1,取反之後再相與一下之後,就把小於a的餘數部分丟掉了。 不過如果a不是2的冪,比如a=3, d=1 ,那麼推算一下,上面的計算就不成立了。
這種計算地址或者長度對齊,取整的宏還是很有用的。cpu訪問對齊的數據跟快把,不對齊的的int之類的,有可能區要多次內存訪問才能取到值出來。 寫個簡單的字符串內存池,AllocateString時打算把所有的字符串放到一個連續的內存塊上,覺得還是把長度取整一下比較好。這樣後續的對字符串的memcpy就是內存字對齊,更好吧。