gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:22:01 29 4
gpt4 key购买 nike

我正在学习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(long)?

最佳答案

是的,它似乎包括内存填充,假设所有分配都以 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 用例的合适的近似值。

关于c - Redis源码,zmalloc.c中的(size&(sizeof(long)-1)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22993891/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com