2014-04-10 27 views
0

我學習Redis的源代碼,並在zmalloc.c,Redis的源代碼,(大小及(的sizeof(長)-1))在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

是的,它似乎是包含內存填充的假設,所有分配填充sizeof(長)(如評論所述)。

僞代碼示例:

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用例的恰當的近似值。

相關問題