zmalloc.c中的Redis源代码,(size&(sizeof(long)-1))

时间:2014-04-10 16:36:11

标签: c redis

我正在学习Redis源代码,并在zmalloc.c中学习

 size_t zmalloc_size(void *ptr) {
 void *realptr = (char*)ptr-PREFIX_SIZE;
 size_t size = *((size_t*)realptr);
/* Assume at least that all the allocations are padded at sizeof(long) by
  * the underlying allocator. */
 if (size&(sizeof(long)-1)) size += sizeof(long)-(size&(sizeof(long)-1));
 return size+PREFIX_SIZE;
}

我对

感到困惑
if (size&(sizeof(long)-1)) size += sizeof(long)-(size&(sizeof(long)-1));

它的作用是什么?内存填充?那么为什么sizeof(长)?

1 个答案:

答案 0 :(得分:1)

是的,似乎要包含内存填充,假设所有分配都以sizeof(long)填充(如注释所述)。

伪代码示例:

size = 6 // as an example
sizeof(long) == 4
size & (sizeof(long) - 1) == 6 & (4 - 1) == 6 & 3 == 2
size += 4 - 2
size == 8 // two bytes of padding included

我在C中很新鲜,所以你可能不应该接受我的话。我不确定为什么人们可以假设底层分配器将以long的大小对齐,也许它只是一个适当的近似值,足以满足zmalloc_size的用例。