博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分配内存对齐的内存空间
阅读量:6334 次
发布时间:2019-06-22

本文共 1378 字,大约阅读时间需要 4 分钟。

hot3.png

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

你可能感兴趣的文章
mysql主主同步+Keepalived
查看>>
java位移运算符 转
查看>>
转:strcpy实现的考察要点
查看>>
【转】Map/Reduce简介
查看>>
LOB
查看>>
js验证姓名和身份证号
查看>>
Solr空格默认值是AND还是OR
查看>>
(转)SQL SERVER 生成建表脚本
查看>>
对 Java Integer.valueOf() 的一些了解
查看>>
253:Cube painting
查看>>
2016 年 Java 工具和技术的调查:IDEA 已超过
查看>>
Robot Framework学习笔记(十)------Selenium2Library库
查看>>
openssl 自建CA签发证书 网站https的ssl通信
查看>>
18、jmeter对数据库进行压力测试
查看>>
19、Linux命令对服务器内存进行监控
查看>>
springmvc中的字典表
查看>>
iterator的使用和封个问题
查看>>
mac 安装php mongo扩展,无法使用的解决办法
查看>>
hdu 4627 The Unsolvable Problem
查看>>
hdu 4268 Alice and Bob(STL贪心)
查看>>