分配内存对齐的内存空间

void *_aligned_malloc(size_t size,int aligned)
{
    void *tempPtr = malloc(size + aligned);
    char offset = aligned - ((int)tempPtr % aligned);
    char *alignedPtr = (char*)tempPtr + offset;
    alignedPtr[-1] = offset;
    return (void*)alignedPtr;
}

void _aligned_free(void *ptr)
{
    char offset = ((char*)ptr)[-1];
    free((char*)ptr - offset);
}

nginx的宏定义:

#define ngx_align(d, a)     (((d) + (a - 1)) & ~(a - 1))

意思是以a为对齐因子,申请d大小的空间,实际至少需要分配多大空间来实现内存对齐。

例如,按16字节对齐,申请56个字节的空间,为了内存对齐实际分配的是64字节。

1)先看~(a-1)的含义
假设a是8 对应二进制是0000 1000
(a-1)对应的就是    0000 0111
~(a-1)对应的是     1111 1000
任何一个数 与~(a-1)按位相与 就是把低三位置0 也就是把该数变成 8的倍数
对应题目中的就是 64、128的倍数,也就形成了对齐。

2)对于d + (a-1)的操作目的就是
eg:70以64对齐 结果是128而不是64的区别了。

 

// 实现任意字节对齐的内存分配和释放
    void *AllignedMalloc(size_t size, int aligned)
    {
        // 判断整数是否是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-1));


        // 保存原始内存地址,void*不能进行++操作,void**才能进行++操作
        alignedData[-1] = data;

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

void AlignedFree(void *data)
    {
        if (data)
        {

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

 

 

转载于:https://my.oschina.net/zengjs275/blog/1068850

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值