用malloc()函数动态分配内存的方式重新写一个函数,实现内存地址的32位字节对齐?? 30
这是一次面试时候一位面试官问到的问题,当时纠结了很久都没得到一个靠谱的答案!!哪位大神帮帮忙看一下怎么做,说一下大概思路!最好写程序实现!!谢谢啊!!!...
这是一次面试时候一位面试官问到的问题,当时纠结了很久都没得到一个靠谱的答案!!哪位大神帮帮忙看一下怎么做,说一下大概思路!最好写程序实现!!谢谢啊!!!
展开
4个回答
展开全部
首先给出最简单简介方案: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,你只需要加入一个全局的数据结构,这个数据结构记录一组这样的映射关系:<myMalloc_4Bytes_align返回的指针, myMalloc_4Bytes_align中malloc返回的指针>,有了这个记录,当free(Pointer)的时候,安如下步骤即可:
1 查找上述数据结构中所有的项,如果某一项的第一个数据等于Pointer,执行第二部。
2 如果有,删除这个Pointer对应的第二项,同时在数据结构中删除1中查找到的项。
俺估计,对于面试而言,方案2是最佳选择。因为重写系统的内存分配函数,是一个庞大而复杂的工作,不可能在短短的面试中说清楚。方案2是能在几分钟内拿出结果的。
注: 124812497的方案,只实现了每次分配的内存数是4字节的整数倍,并没有实现内存安4字节对齐(malloc返回的地址总是4字节的整数倍)
其次给出一个方案,能在面试这样短暂的时间内给出答案的---用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,你只需要加入一个全局的数据结构,这个数据结构记录一组这样的映射关系:<myMalloc_4Bytes_align返回的指针, myMalloc_4Bytes_align中malloc返回的指针>,有了这个记录,当free(Pointer)的时候,安如下步骤即可:
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位。
char *p = (char *)malloc(4);(等号左面可以使int * 或 struct *什么的),一个malloc(1)分配一个字节8位。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先确认一下是地址对齐还是size对齐。
例如 p=malloc(size); 要求p的值是4字节对齐?
还是说要求size值是4字节对齐?
例如 p=malloc(size); 要求p的值是4字节对齐?
还是说要求size值是4字节对齐?
追问
都要对齐!
追答
int size2=0;
void *p=NULL,*temp_p=NULL;
size2=size+(size%4) ? 4:0+4;//目的是先实现size的4字节对齐,再增加4个字节用于后面可能出现的指针调整
temp_p=(void *)malloc(size2);
p = temp_p+temp_p%4;//确保指针是4字节对齐的
释放内存时用temp_p,操作内存时用p
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
他的意思应该是模拟内存分配和回收,严蔚敏的书上有详细介绍,不知道有没有别的要求,如果没有可以用目录表,这个比较简单。先定义一个数组,把数组占的空间用来模拟内存分配和回收。
另外对于字节对齐,如果用户申请的内存大小不是4的倍数,给它凑成4的倍数。
另外对于字节对齐,如果用户申请的内存大小不是4的倍数,给它凑成4的倍数。
更多追问追答
追问
他的意思是说保证所有数据类型的数据地址都满足32位字节对齐,不管char、int、float之类的数据都满足32位字节对齐!
追答
如果是结构体只知道size是不够,必须知道每一个成员的类型,才知道给它分配多少内存,除了double以外,其他类型都分配4字节.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询