程序员面试金典: 9.13 C和C++ 13.9编写对齐的malloc和free函数。

#include <iostream>
#include <stdio.h>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值