关闭

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

1069人阅读 评论(9) 收藏 举报
分类:

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

源码实现

// 实现任意字节对齐的内存分配和释放
    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;  // 被转换为一级指针
    }
void AlignedFree(void *data)
    {
        if (data)
        {

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

代码解析

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

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

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

这里写图片描述

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

个人觉得,上面的图将源码的原理表达的还是比较清楚的,有什么问题的,欢迎大家留言讨论,时间不早了,睡觉了.

2016-5-31 01:12:45

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:183841次
    • 积分:1846
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:8篇
    • 译文:1篇
    • 评论:184条
    个人简介
    专注于计算机视觉与深度学习。

    目前就职于南京小视科技 http://www.minivision.cn/

    交流请留言或者邮件,不怎么用QQ

    Email:654393155@qq.com

    Weibo:weibo.com/qianqing02468
    欢迎赞赏

    如果您觉得此博客对您有用,欢迎扫码进行赞赏。( ^_^ )



    最新评论