[英]Size of C data types on different machines & sizeof(complex long double)
[英]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.