博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序员面试金典: 9.13 C和C++ 13.9编写对齐的malloc和free函数。
阅读量:3658 次
发布时间:2019-05-21

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

#include 
#include
using namespace std;/*问题:编写支持对齐分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除分析: malloc原型是: void* malloc(int size),free(void* ptr)。地址能被2^n整除,因此根据给定的size,要计算 size <= 2^n,其中n为整数,比如6 < =2^3,因此分配的字节为8 对于size要计算实际分配的字节。 关键是实际的地址分配到底是如何产生的:难道用new吗?它必须返回一个首地址。 free函数需要根据malloc传递的首地址释放内存,关键该函数如何知道要释放的内存截至地址?难道是malloc分配的地址如果不赋值,就默认对应"\0"吗? 不会。关键:书上解法:实现的方法是对malloc的封装,还用malloc。设对齐大小为alignment 分配地址需要多分配:alignment-1,比如对齐大小为16,原始需求内存为100,需要多分配15内存,使得首地址可以在1~16中任意选择位置, 而1~16中必定存在数是16的倍数。 设此时添加alignment-1内存对应的地址为:void* p,p为指向一个长度为115的内存的首地址,下面需要确定移动到能被16整除的地址处 1】为了确保地址能被16整除,将p从地址转化为int加上偏移量15【为什么还要加?不是已经计算过了吗】,再和 ~(alignment-1)进行与操作,得到q可讲一道被16整除的内存地址 2】释放真正内存时,需要释放额外内存,将原始内存地址保存在额外内存中, 在紧邻地址对齐的内存快之前存放该地址。*/void* myMalloc(size_t size , int alignment){ void* p1; void** p2; p1 = (void*) malloc(size + alignment - 1); if( p1 == NULL ) { return NULL; } //获得了真正需要分配的内存长度后,下面需要开辟内存地址了,如何?,还是用malloc p2 = (void**) ( ( size_t(size) + alignment ) & ~(alignment - 1 ) ); //存储实际内存地址 p2[-1] = p1; return p2;}//释放内存void myFree(void* p2){ //先找到实际地址,再释放,额外内存不需要管 void* p1 = ( (void**)p2)[-1]; free(p1);}int main(int argc, char* argv[]){ getchar(); return 0;}

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

你可能感兴趣的文章
runtime.Gosched的使用
查看>>
无缓冲channel
查看>>
有缓冲channel
查看>>
Ticker的使用
查看>>
通过select实现斐波那契数列
查看>>
通过select实现斐波那契数列(画图)
查看>>
定时器停止
查看>>
分层模型介绍
查看>>
http协议和url介绍
查看>>
请求包和应答包简单介绍
查看>>
统计同成绩的学生人数
查看>>
最小年龄的3个职工
查看>>
Spring Data JPA介绍与Spring的整合
查看>>
Spring Data JPA 自定义Repository接口与子接口
查看>>
Java 对上传文件进行魔数校验
查看>>
RabbitMQ入门高级特性
查看>>
同步、异步与阻塞、非阻塞的理解
查看>>
Java NIO核心三大组件Channel、Buffer和Selector(一)
查看>>
Java NIO核心三大组件Channel、Buffer和Selector(二)
查看>>
常用字符集及字符编码和Charset类
查看>>