c - dlmalloc 中的内存对齐掩码

标签 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

最佳答案

不需要。看起来像 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/

相关文章:

将 float 与零进行比较

分配给较大宽度的整数时的 C 整数溢出行为

c - fork 多个子进程和 open()/dup2()

database - 刷新数据库是什么意思?还有 "flash"

ios - UIImage 内存未释放 VM : ImageIO_JPEG_DATA?

memory - 为什么启用/禁用A20线

c - 将 __func__ 视为字符串文字而不是预定义的标识符

c - 将输入文件分成两个不同的二维数组

linux munmap 不工作(或者至少不能立即工作)

c# - 在内存、IsoStorage 和服务器之间同步