1. 程式人生 > >C 記憶體 關於位元組對齊分配記憶體 malloc free

C 記憶體 關於位元組對齊分配記憶體 malloc free

一)背景:

  •     硬體原因:有的平臺或者特定的硬體對記憶體訪問有對齊要求
  •     效能原因: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]));
}


。。待續