C 内存 关于字节对齐分配内存 malloc free

本文探讨了硬件和性能需求下内存对齐的重要性,并提供了一种自定义内存分配方法,通过aligned_malloc和aligned_free函数确保内存地址符合特定对齐要求,以优化CPU访问效率。

一)背景:

  •     硬件原因:有的平台或者特定的硬件对内存访问有对齐要求
  •     性能原因:cpu读取不对齐的内存可能会造成两次读取操作,影响性能

二)代码实现
例:比如要求 8bit 对齐,内存只能是8的倍数
       aligned_malloc( 17, 8);
      自己实现代码的关键是怎么存储原始的malloc地址信息,以及 怎么得到合适的内存地址
 

typedef  unsign int u32;

void* aligned_malloc(u32 size, u32 align)
{
    if(align& (align- 1)) //2的倍数
    {
        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]));
}


。。待续

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值