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)' –