dlmalloc中的内存对齐掩码

时间:2017-02-26 19:20:04

标签: c memory

我正在阅读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

1 个答案:

答案 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)