首先给出最简单简介方案:CRT中本来就有个函数,叫 _aligned_malloc,他能实现各种内存对齐,如果在实际的项目中,使用微软给你提供的函数是最高效和安全的。面试的时候你能报出这个函数,可以看出你是一只C++老鸟。
其次给出一个方案,能在面试这样短暂的时间内给出答案的---用CRT的malloc作个二次开发,代码如下:
void* myMalloc_4Bytes_align(size_t sz)
{
if(sz <= 0) {
return NULL;
}
unsigned char* pSystemPointer = (unsigned char* )malloc(sz + 3);
if(NULL == pSystemPointer) {
return NULL;
}
size_t offset = 4 - (((unsigned int)pSystemPointer ) % 4);
return pSystemPointer + offset;
}
既然别人没有问题怎么free,这个问题是简单的,如果要你自己free,你只需要加入一个全局的数据结构,这个数据结构记录一组这样的映射关系:
1 查找上述数据结构中所有的项,如果某一项的第一个数据等于Pointer,执行第二部。
2 如果有,删除这个Pointer对应的第二项,同时在数据结构中删除1中查找到的项。
俺估计,对于面试而言,方案2是最佳选择。因为重写系统的内存分配函数,是一个庞大而复杂的工作,不可能在短短的面试中说清楚。方案2是能在几分钟内拿出结果的。
注: 124812497的方案,只实现了每次分配的内存数是4字节的整数倍,并没有实现内存安4字节对齐(malloc返回的地址总是4字节的整数倍)
一楼的两个哥们对话太有意思了~一楼回答是正确的,1个字节就是8位,32位为4个字节,
char *p = (char *)malloc(4);(等号左面可以使int * 或 struct *什么的),一个malloc(1)分配一个字节8位。
先确认一下是地址对齐还是size对齐。
例如 p=malloc(size); 要求p的值是4字节对齐?
还是说要求size值是4字节对齐?
他的意思应该是模拟内存分配和回收,严蔚敏的书上有详细介绍,不知道有没有别的要求,如果没有可以用目录表,这个比较简单。先定义一个数组,把数组占的空间用来模拟内存分配和回收。
另外对于字节对齐,如果用户申请的内存大小不是4的倍数,给它凑成4的倍数。