昨天面試高通Linux Kernel,面試官考了一個malloc內存對齊的問題,我晚上的時候細細的想了一下,實在是學習的不到位。
有的時候真的應該感謝,像是Qt、Ubuntu Gcc的編譯器,他們做的工作很多,malloc直接分配對齊了的內存。如果真的是一個
不是很完善的平台,直接分配給你一個沒對齊的內存,當我們傳輸字節指令的時候分高低八位的時候,定義聯合體和結構體這樣的偷懶方式
絕對會發一個錯誤的指令。
oh 要學的太多了。。。。
實際上,對齊參數(MALLOC_ALIGNMENT)大小的設定需要滿足以下兩點:
-
必須是2的冪
-
必須是void *的整數倍
所以從request2size可知,在64位系統,如果申請內存為1~24字節,系統內存消耗32字節,當申請25字節的內存時,系統內存消耗48字節。而對於32位系統,申請內存為1~12字節時,系統內存消耗為16字節,當申請內存為13字節時,系統內存消耗為24字節。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void* aligned_malloc(size_t required_bytes, size_t alignment)
{
int offset = alignment - 1 + sizeof(void*);
void* p1 = (void*)malloc(required_bytes + offset);
if (p1 == NULL)
return NULL;
void** p2 = (void**)( ( (size_t)p1 + offset ) & ~(alignment - 1) );
p2[-1] = p1;
return p2;
}
void aligned_free(void *p2)
{
void* p1 = ((void**)p2)[-1];
free(p1);
}
int main()
{
void * p[128];
int i;
for(i = 0; i < 128; ++i)
{
p[i] = aligned_malloc(i, 16);
printf("%p\n", p[i]);
}
for(i = 0; i < 128; ++i)
{
aligned_free( p[i] );
}
return 0;
}