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]));
}


。。待续

猜你喜欢

转载自blog.csdn.net/poject/article/details/85252285