2015-08-31 116 views
0

我目前正在閱讀一個程序,用於對齊內存分配和空閒分配的內存。這裏是C代碼:如何用malloc()完成字節對齊?

/** 
* Aligned memory allocation 
* param[in] size Bytes to be allocated 
* param[in] alignment Alignment bytes 
* return Address of allocated memory 
*/ 
inline void* _al_malloc(size_t size, size_t alignemt) 
{ 
    size_t a = alignment - 1; 
    size_t word_length = sizeof(void*); 
    void* raw = malloc(word_length + size + a); 
    if (!raw) 
    { 
     return 0; 
    } 
    void* ptr = (void*)((size_t(raw) + word_length + a) & ~a); 
    *((void**)ptr - 1) = raw; 
    return ptr; 
} 



/** 
* Free allocated memory 
*/ 
inline void _al_free(void * ptr) 
{ 
    if (!ptr) 
    { 
     return; 
    } 
    void* raw = *((void**)ptr - 1); 
    free(raw); 
} 

這些操作如何確保字節對齊的內存?

+1

使用C11'aligned_alloc()',返回的指針可以傳遞給'free()'。 – EOF

+4

它分配額外的內存,然後移動返回的指針的起始地址,以便它正確對齊(可能會留下幾個未使用的字節)。 –

+0

hi @ BoPersson,但爲什麼未使用字節的長度是word_length + a? – CJZ

回答

3

它分配額外的內存,然後移動返回的指針的起始地址,以便它正確對齊(可能留下幾個字節未使用)。

更詳細的:

size_t a = alignment - 1; 

如果alignment是2的冪,這樣會給的需要額外的字節的數目和用於在對準指針不允許地址位的掩碼。

例如,如果對準是8我們可能需要分配7個額外的字節,以確保它們中的一個在8.

size_t word_length = sizeof(void*); 

計算一個額外的指針的大小(由free以後需要被對準)。

void* raw = malloc(word_length + size + a); 

分配需要的內存塊+指針的大小+額外的字節,我們可能需要對齊。

if (!raw) 
{ 
    return 0; 
} 

如果我們失敗,返回一個空指針。

void* ptr = (void*)((size_t(raw) + word_length + a) & ~a); 

現在得到一個新的指針,它是原始指針+保存空間+正確對齊所需的字節數。

*((void**)ptr - 1) = raw; 

而且從malloc保存原來的指針,東陽是它以後需要free

return ptr; 

完成。

+0

因此,如果通過非2次冪的對齊,這個代碼就會被破壞? –

+0

也許。我從未見過任何對齊-5數據。 :-)爲了保護,我們可能想要添加一個檢查對齊是否有適當的值。 –

+0

@BoPersson,仍然想知道爲什麼void * ptr =(void *)((size_t(raw)+ word_length + a)& ~a);可以得到正確的地址 – CJZ