我正在阅读Doug Lea的内存分配器here。我找到了以下宏来计算要添加到地址的偏移量以使其对齐。
/* 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 :(得分:1)
不需要。看起来像belt and suspenders代码。
以下内容只能采用[0...CHUNK_ALIGN_MASK]
的值。 & CHUNK_ALIGN_MASK
不会影响结果。
((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) ...))
最好只使用A
的1次评估,以下内容。在这种情况下,需要第二个& CHUNK_ALIGN_MASK
来处理对齐的情况:
#define align_offset(A) \
((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)