簡體   English   中英

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

[英]Redis source code, (size&(sizeof(long)-1)) in the zmalloc.c

我正在學習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用例的近似值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM