C 記憶體 關於位元組對齊分配記憶體 malloc free
阿新 • • 發佈:2019-01-01
一)背景:
- 硬體原因:有的平臺或者特定的硬體對記憶體訪問有對齊要求
- 效能原因:cpu讀取不對齊的記憶體可能會造成兩次讀取操作,影響效能
二)程式碼實現
例:比如要求 8bit 對齊,記憶體只能是8的倍數
aligned_malloc( 17, 8);
自己實現程式碼的關鍵是怎麼儲存原始的malloc地址資訊,以及 怎麼得到合適的記憶體地址
typedef unsign int u32; void* aligned_malloc(u32 size, u32 align) { if(align& (align- 1)) { return NULL; } else { //先申請記憶體 (三部分組成:sizeof(void*)->存放原始需要釋放記憶體地址) void *p= malloc(sizeof(void*) + size + align); if(pbuff) { void *pbuf = (void*)((u32)p+sizeof(void*)); //通用做法 //ANSI C: void*可以指向任何指標,但是不能對其運算,需要轉換為具體的型別才能運算 //GNU C: void*可以指向任何指標,可以運算 預設作為 char* 計算 void *pa= (void*)(((u32)(pbuf) | (align- 1)) + 1); //把原始的分配記憶體的地址儲存起來,以便free的時候呼叫把所有的記憶體都釋放掉 ((void**)pa)[-1] = p; return pa; } else { return NULL; } } } void aligned_free(void *p) { //free 會根據 malloc 分配的記憶體首地址,找到相關管理結構體,根據size等資訊來釋放 相關記憶體 free(((void**)p)[-1])); }
。。待續