关闭

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

1323人阅读 评论(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网站的观点或立场

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

任意自己内存对齐,intel笔试
  • Gen_Ye
  • Gen_Ye
  • 2016-09-28 23:00
  • 1545

关于Malloc字节对齐的思考

1  假设malloc返回一个指针,希望该地址16字节对齐
  • tangcong29
  • tangcong29
  • 2014-11-21 23:02
  • 2306

malloc函数字节对齐很经典的问题

int *mallocedMemory = (int *)malloc(1024+15);alignedMemory = (int *)(((int)mallocedMemory + 15) & ~1...
  • typhoonzb
  • typhoonzb
  • 2009-10-27 11:03
  • 5508

动态分配内存返回地址对齐的指针

今天在调用一个引擎接口的时候,发现要求传入的资源地址要按照16位对齐,即地址值要能被16位整除,资源地址是把资源文件加载到内存的首地址,使用malloc按照资源文件的长度分配,malloc返回的地址不...
  • victory08
  • victory08
  • 2016-01-21 17:14
  • 1248

malloc内存分配字节对齐问题

malloc内存分配以及对齐问题
  • shemangui
  • shemangui
  • 2016-01-04 22:58
  • 2559

实现支持2^n字节对齐分配的malloc和free函数

#include  #include  void* aligned_malloc(size_t size, size_t alignd_byte) { //offset地址偏移量(byte) /...
  • liujianfei526
  • liujianfei526
  • 2016-11-04 10:53
  • 276

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

任意自己内存对齐,intel笔试
  • Gen_Ye
  • Gen_Ye
  • 2016-09-28 23:00
  • 1545

malloc内存分配字节对齐问题

malloc内存分配以及对齐问题
  • shemangui
  • shemangui
  • 2016-01-04 22:58
  • 2559

ESP8266 内存优化

通过以下四种方法可以优化 ESP8266 应用的内存使用,减少应用的内存占用空间。     1. 将字符串放到 Flash 中: (1) 有些字符串可以放在 Flash 中,特别是长字符串,例如...
  • fuzhibo
  • fuzhibo
  • 2016-12-08 11:00
  • 1645

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

任意字节对齐的内存分配和释放。 源码实现 // 实现任意字节对齐的内存分配和释放 void *AllignedMalloc(size_t size, int aligned) { ...
  • gettogetto
  • gettogetto
  • 2017-03-27 16:51
  • 239
    个人资料
    • 访问:217001次
    • 积分:2012
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:8篇
    • 译文:1篇
    • 评论:193条
    个人简介
    专注于计算机视觉与深度学习。

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

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

    Email:654393155@qq.com

    Weibo:weibo.com/qianqing02468
    欢迎赞赏

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



    最新评论