博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CareerCup] 13.9 Aligned Malloc and Free Function 写一对申请和释放内存函数
阅读量:6529 次
发布时间:2019-06-24

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

 

13.9 Write an aligned malloc and free function that supports allocating memory such that the memory address returned is divisible by a specific power of two.

 EXAMPLE
 align_malloc (1000,128) will return a memory address that is a multiple of 128 and that points to memory of size 1000 bytes.
 aligned_free() will free memory allocated by align_malloc

 

这道题让我们写一对申请和释放内存的函数,而且要求我们申请的内存块的起始地址要能够被2的倍数整除。题目中给了例子,让我们申请1000字节大小的内存空间,且起始地址要能被128整除。我们知道,在使用malloc申请内存时,我们无法控制堆中具体哪块内存被申请了,如果我们非要首地址被128整除,那么我们需要些小技巧:我们需要再申请127个字节大小,这样我们的首地址即时申请到的不能被128整除,我们也能够调整到能整除的位置,并且后面的内存空间也足够1000字节,可以使用如下的代码来申请:

void* aligned_malloc(size_t required_bytes, size_t alignment) {    int offset = alignment - 1;    void *p = (void*)malloc(required_bytes + offset);    void *q = (void*)(((size_t)(p1) + offset) & ~(alignment - 1));    return q;}

我们申请了额外的空间alignment-1,然后再调整首地址的位置通过和~(alignment-1)相与,得到能被alignment整除的地址,下面我们就要来看如何释放内存,由于我们多申请了offset的内存,我们最终也需要将这些内存释放掉,我们需要一个指针来记录整个内存块的起始位置,由于新加了指针,别忘了还要给指针申请空间,所以我们需要多申请的空间大小为alignment - 1 + sizeof(void*),参见如下代码:

 

class Solution {public:    void* aligned_malloc(size_t required_bytes, size_t alignment) {        void *p1;        void **p2;        int offset = alignment - 1 + sizeof(void*);        if ((p1 = (void*)malloc(required_bytes + offset)) == NULL) {            return NULL;        }        p2 = (void**)(((size_t)(p1) + offset) & ~(alignment - 1));        p2[-1] = p1;        return p2;    }    void aligned_free(void *p2) {        void *p1 = ((void**)p2)[-1];        free(p1);    }};

我们定义一个双指针p2,在-1的位置存上p1,也就是整个申请的内存块的起始地址,在0的位置存上能被alignment整除的位置,释放内存时从p2中提取出p1,将p1释放掉即可。

转载地址:http://uzqbo.baihongyu.com/

你可能感兴趣的文章
轮毂电机光电增量编码器的ABZ信号详解
查看>>
TextBox Template
查看>>
Linux MySQL 储存中文失败简单解决办法
查看>>
求最大值及其下标
查看>>
洛谷——P1330 封锁阳光大学
查看>>
css选择器
查看>>
zabbix-agent配置文件说明
查看>>
linux系统配置之bash shell的配置(centos)
查看>>
linux C 9*9
查看>>
hdu 1695: GCD 【莫比乌斯反演】
查看>>
python的string操作总结
查看>>
如何把word中的图片怎么导出来呢?
查看>>
Python连接Arduino的方法
查看>>
CMD指令大全
查看>>
十五天精通WCF——第二天 告别烦恼的config配置
查看>>
Qt多线程学习:创建多线程
查看>>
设计模式学习---UML常见关系的实现
查看>>
图解openssl实现私有CA
查看>>
BZOJ2213 : [Poi2011]Difference
查看>>
c++ Constructor FAQ 继续
查看>>