1
我正在閱讀Doug Lea的內存分配器here。我發現下面的宏來計算要添加到地址以使其對齊的偏移量。dlmalloc中的內存對齊掩碼
/* The bit mask value corresponding to MALLOC_ALIGNMENT */
#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE)
/* True if address a has acceptable alignment */
#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
/* the number of bytes to offset an address to align it */
#define align_offset(A)\
((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
我的問題是關於最後& CHUNK_ALIGN_MASK
。爲什麼這樣做?
當MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)
完成後,您已經知道地址離對齊邊界有多遠。爲什麼AND
再次帶着面具?
什麼是'SIZE_T_ONE'?根據這一點,您所詢問的代碼可能不是多餘的。例如。如果'X'是'16 - (7&3)',那麼'X!=(X&3)' –