实现任意字节对齐的内存分配和释放

任意字节对齐的内存分配和释放。

源码实现

// 实现任意字节对齐的内存分配和释放
    void *AllignedMalloc(size_t size, int aligned)
    {
        // aligned is a power of 2
        assert((aligned&(aligned - 1)) == 0);

        // 分配内存空间
        void *data = malloc(sizeof(void *)+aligned + size);


        // 地址对齐
        void **temp = (void **)data + 1;
        void **alignedData = (void **)(((size_t)temp + aligned - 1)&-aligned);


        // 保存原始内存地址
        alignedData[-1] = data;

        return alignedData;  // 被转换为一级指针
    }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
void AlignedFree(void *data)
    {
        if (data)
        {

            free(((void **)data)[-1]);
        }
    }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

代码解析

void *data;这个类型是一个指针类型,sizeof(data)是4个字节,但是data++并不是移动4个字节,因为data是一个void *型,没有明确说明指向哪种类型,如果int *data;data++则是移动4个字节,所以这里需要转换为二级指针,二级指针是指向一级指针的,而一级指针是内存地址,而32位系统中一级指针是32位,也就是4个字节,所以,这种情况下二级指针实际上指向一个32位的类型变量的指针(64为系统中,二级指针类似于指向一个64位类型变量的指针),所以你移动二级指针,如果是32位系统,就是移动4个字节,如果是64位系统,就是移动8个字节。

这里以32位系统,16字节对齐为例,用示意图表示更加清楚一点。

原始分配内存图 
这里写图片描述

下面考虑两种情况: 
这里写图片描述

这里写图片描述

这里要注意转为二级指针后: 
1. 指向的内存区域是指针变量,存放的是地址,即编译器对内存的解析发生变化 
2. 对void **进行自增++,移动的是一个指针变量的大小 
这里写图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值