內存池的內存地址對齊和長度按照2的冪取整

#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就是內存字對齊,更好吧。



發佈了42 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章