2017-02-26 43 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)