我正在阅读 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
?
最佳答案
不需要。看起来像 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)
关于c - dlmalloc 中的内存对齐掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473033/