2009-09-11 50 views
2

我工作的一個內存池實現,我對指針對準有點糊塗了......問題有關指針對準

假設我有手了固定大小的內存塊的存儲池,在內存池創建點我malloc((大小)*(塊的數量))。如果分配的對象是對象,並且sizeof運算符的大小不應該成爲問題,但是如果大小不均勻(無論出於何種原因,他/她需要100個字節塊),那麼當我分割由malloc給出的塊時我最終會得到未對齊的指針。我的問題是,我是否應該將這些街區對準一些邊界線,如果是的話?

+0

哪個架構(CPU系列)?它有所不同。 – derobert 2009-09-11 03:59:58

+0

x86/x86_64主要是 – dryajov 2009-09-11 04:14:02

回答

2

X86將在沒有對齊的情況下工作,但數據對齊時性能會更好。對於類型的比較通常是sizeof(類型),最多可達16(字節)。

我寫了這個愚蠢的測試程序,以確保(asuming malloc知道它在做什麼),並且它在我的amd64盒子上返回16。在32位模式下進行編譯時,它返回8:

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    int i; 
    unsigned long used_bits = 0, alignment; 

    for (i = 0; i < 1000; ++i) { 
     used_bits |= (unsigned long)malloc(1); /* common sizes */ 
     used_bits |= (unsigned long)malloc(2); 
     used_bits |= (unsigned long)malloc(4); 
     used_bits |= (unsigned long)malloc(8); 
     used_bits |= (unsigned long)malloc(16); 
     used_bits |= (unsigned long)malloc(437); /* random number */ 
    } 

    alignment = 1; 
    while (!(used_bits & alignment)) { 
     alignment <<= 1; 
    } 

    printf("Alignment is: %lu\n", alignment); 
    return 0; 
} 
+0

我假設你談論16位,然後在2個字節的邊界。 – dryajov 2009-09-11 04:35:12

+0

否,16字節/八比特組(128比特) – derobert 2009-09-11 04:36:43

3
正確

對準是在大多數x86實現(和某種對準的實際上是強制性的在其他架構)至少有幫助(性能代價)。您可能會問(像calloc一樣)一對參數,項目大小(以字節爲單位)和項目數量,而不是一個(像malloc那樣以字節爲單位);那麼你可以固有地對齊(通過舍入塊大小)到項目大小之上的下一個更高的2的冪(但是切換到大於16的16個字節的倍數,不要一直保持倍增,就像@derobert推薦和解釋的一樣! - )。這樣,如果一個調用者只需要N個字節而沒有任何對齊或填充,他們總是可以要求每個1個字節的N項(就像他們使用calloc並出於同樣的原因;-))。