[CareerCup] 13.9 Aligned Malloc and Free Function 写一对申请和释放内存函数-阿里云开发者社区

开发者社区> 李博 bluemind> 正文

[CareerCup] 13.9 Aligned Malloc and Free Function 写一对申请和释放内存函数

简介:
+关注继续查看

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);
    }
};

本文转自博客园Grandyang的博客,原文链接:写一对申请和释放内存函数[CareerCup] 13.9 Aligned Malloc and Free Function ,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【教程】阿里云商标专家辅助申请快速入门
阿里云商标注册网站的体验非常好的,相对于自助申请商标,【专家辅助申请】服务能够大大提高商标注册的成功率。【专家辅助申请】服务是付费的,但是这个价格相对那些代理商简直是太便宜了,你可以去对比一下其他小代理商,不要看那些小代理商的价格低,会有很多附加费用的,但是阿里云这里是明码标价的。
1165 0
阿里云商标注册流程步骤-阿里云商标自助注册申请步骤
本文详细介绍阿里云商标注册流程步骤及阿里云商标注册价格 阿里云商标注册共分为三种类型,价格也不一样。 分别是:1.自助注册申请。2.专家辅助申请。3.担保注册申请。 自助注册申请价格为300元,专家辅助申请价格为680元,担保注册申请价格为1380元。
17806 0
关于c语言内存分配,malloc,free,和段错误,内存泄露
1.   C语言的函数malloc和free  (1) 函数malloc和free在头文件中的原型及参数        void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。
1585 0
使用new分配内存的类需要自己定义拷贝构造函数
13.22 假定我们希望HasPtr的行为像一个值。即,对于对象所指向的string成员,每个对象都有一份自己的拷贝。 #include #include #include using namespace std; class HasPtr { public: Has...
414 0
数论 代数 群论 范畴论 与 函数式编程 Haskell, Scala
来自China Scala User Group 微信群的一段话,讲的很有意思,这里摘录一下: 数论 研究一个一个的数特性;Object常用术语: 1, 2, 3, "hello world" 代数 研究数上面的操作的特性;常用术语:+ ,-, * , /, mod, concat, 群论 把代数上面的操作,根据共通的特性,分成一个组(群)一个组(群)的来研究。
1604 0
ArcEngine开发中“错误类型"****"未定义构造函数”
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/8990593 问题 在ArcEngine开发的时候,在编译时,发现出现这样的错误,出错的地方在实例化一个对象的时候。
519 0
javascript callback函数的理解与使用
最近做的一个项目中用到了callback函数,于是就研究了下总结下我对javascript callback的理解 首先从callback的字面翻译“回调” 可以理解这是一个函数被调用的机制 当我们遇到一个名词首先可能是百度谷歌搜索看官方是怎么解释的下面是维基百科对回调的定义: a callba...
513 0
+关注
李博 bluemind
云栖社区Java、Redis、MongoDB运营小编,有意合作请联系钉钉:15810436147
2107
文章
1103
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载