我被介绍了如下问题,
我需要实现此API:
a)实现一个分配函数:void * myMalloc(int size),它获取要分配的int字节大小,并在内存中返回一个位置对齐到16字节和这些"尺寸"字节设置为零。
b)实施"解除分配" function:void myFree(void * ptr),它获取指向内存中由myMalloc()函数分配的位置的指针,并释放该位置。
我正在使用 gcc 处理Ubuntu 12.04 LTS。
我的实现方式如下(使用示例主要测试它)。
我已经使用 valgrind 测试了该程序并且没有出现任何错误 - > "释放所有堆块 - 不可能泄漏"
#include <stdio.h>
#include <stdlib.h>
void *myMalloc(int size)
{
void *ret;
char res;
// 0) check valid argument
if (0 >= size)
return NULL;
// 1) allocate size bytes plus 16 extra for the alignment
ret = malloc(sizeof(char) * size + 16);
if (!ret)
return NULL;
// 2) calculate the residue of the address we got from malloc
// and forward the pointer ONE byte before an "aligned" address
res = (long)ret % 16;
ret = (char *)ret + 16 - 1 - res;
// 3) store the offset in that byte and then
// forward the return address ONE byte ahead
*(char *)ret++ = res; // **NOTE B**
// 4) set the (requested) "size" bytes to zero
char *tmp = (char *)ret;
while (0 < size--)
*tmp++ = 0;
return ret;
}
void myFree(void *ptr)
{
char res = *((char *)ptr - 1); // **NOTE C**
ptr = (char *)ptr - res;
free(ptr);
}
void main()
{
void *p = myMalloc(17);
printf("within main, p points to: %p \n",p);
myFree(p);
}
注:
A)我存储了&#34;偏移&#34;由于res将始终是[0 - 15]之间的数字,因此我返回主要地址之前的一个字节,因此我们不需要超过一个字节来存储它。
所以我的问题是:
1)我是否有任何改进,以便改进我的API以及我执行的运行时间和/或内存分配?
2)只是确定,在注意B 和注意C 我已经&#34;已投入&#34;指向char *&#34;仅指#34;曾经,所以铸造&#34;开始行动&#34;用于减去地址和用于&#34; deferenceing&#34;需要提取位于那里的值(char)?
3)是否有任何注意事项我应该注意重新编写操作系统我正在处理?意思是,它会在Windows上以不同的方式工作吗?
提前致谢,
盖。