我正在学习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(长)?
答案 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的用例。