对齐malloc和免费

时间:2014-04-03 14:40:29

标签: c malloc free void-pointers memory-alignment

我被介绍了如下问题,

我需要实现此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上以不同的方式工作吗?

提前致谢,

盖。

0 个答案:

没有答案