我工作的一個內存池實現,我對指針對準有點糊塗了......問題有關指針對準
假設我有手了固定大小的內存塊的存儲池,在內存池創建點我malloc((大小)*(塊的數量))。如果分配的對象是對象,並且sizeof運算符的大小不應該成爲問題,但是如果大小不均勻(無論出於何種原因,他/她需要100個字節塊),那麼當我分割由malloc給出的塊時我最終會得到未對齊的指針。我的問題是,我是否應該將這些街區對準一些邊界線,如果是的話?
我工作的一個內存池實現,我對指針對準有點糊塗了......問題有關指針對準
假設我有手了固定大小的內存塊的存儲池,在內存池創建點我malloc((大小)*(塊的數量))。如果分配的對象是對象,並且sizeof運算符的大小不應該成爲問題,但是如果大小不均勻(無論出於何種原因,他/她需要100個字節塊),那麼當我分割由malloc給出的塊時我最終會得到未對齊的指針。我的問題是,我是否應該將這些街區對準一些邊界線,如果是的話?
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;
}
對準是在大多數x86實現(和某種對準的實際上是強制性的在其他架構)至少有幫助(性能代價)。您可能會問(像calloc一樣)一對參數,項目大小(以字節爲單位)和項目數量,而不是一個(像malloc那樣以字節爲單位);那麼你可以固有地對齊(通過舍入塊大小)到項目大小之上的下一個更高的2的冪(但是切換到大於16的16個字節的倍數,不要一直保持倍增,就像@derobert推薦和解釋的一樣! - )。這樣,如果一個調用者只需要N個字節而沒有任何對齊或填充,他們總是可以要求每個1個字節的N項(就像他們使用calloc並出於同樣的原因;-))。
哪個架構(CPU系列)?它有所不同。 – derobert 2009-09-11 03:59:58
x86/x86_64主要是 – dryajov 2009-09-11 04:14:02