2017-02-26 45 views
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再次帶着面具?

+0

什麼是'SIZE_T_ONE'?根據這一點,您所詢問的代碼可能不是多餘的。例如。如果'X'是'16 - (7&3)',那麼'X!=(X&3)' –

回答

1

這是不需要的。看起來像​​的代碼。

以下只能取[0...CHUNK_ALIGN_MASK]的值。 & CHUNK_ALIGN_MASK不影響結果。

((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ 
    ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) ...)) 

最好只使用1個評估A與以下。在這種情況下,需要第二個& CHUNK_ALIGN_MASK來處理對齊的情況:

#define align_offset(A) \ 
    ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)