这个自定义malloc好吗?

时间:2016-07-14 22:23:03

标签: c pointers memory-management pointer-arithmetic

我需要为GPU编程编写一个自定义malloc。这会正常工作吗?

void* malloc(int size, int* bytesUsed, uchar* memory){
  int startIdx = (*bytesUsed);
  (*bytesUsed) += size;
  return (void*)(memory+startIdx);
}

我是C编程新手,我可能已经做过与指针算术相关的错误或者其他什么......想法是bytesUsed给你第一个空闲地址memory的索引,所以你将它递增size,然后将递增的索引作为指针返回。

2 个答案:

答案 0 :(得分:2)

我不确定这个简单的基于堆栈的解决方案是否适合您

#include <stdint.h>
const size_t ALLOCSIZE = 1024;
typedef uint8_t byte;

static byte buf[ALLOCSIZE];
static byte *pbuf = buf;

byte *alloc(size_t n)
{
    /* if there is room */
    if (buf + ALLOCSIZE - pbuf >= n) {
        pbuf += n;
        return pbuf - n;
    } else
        return NULL;
}

我没有提供free,因为你说你不需要解除分配。

答案 1 :(得分:1)

有一些问题:

  1. 最大的问题是对齐。返回的指针需要对齐。由于没有给出malloc()所需的指针类型,因此使用max_align_t“这是一种对象类型,其对齐方式与所有上下文中的实现所支持的一样大”C11dr§7.192。注意:{ {1}}也需要这种对齐方式。因此,如果其他代码影响它,则应用类似的代码。

    *bytesUsed
  2. 无法检测到内存不足。

  3. 避免重复使用标准库名称。如果需要,代码可以稍后if (size%sizeof(max_align_t)) { size += sizeof(max_align_t) - size%sizeof(max_align_t); } // or size = (size + sizeof(max_align_t) - 1)/sizeof(max_align_t)*sizeof(max_align_t);

    define
  4. // void* malloc(int size, int* bytesUsed, uchar* memory); void* RG_malloc(int size, int* bytesUsed, uchar* memory); // if needed #define malloc RF_malloc 预计会有不同的分配类型:malloc(),而不是size_t

    int
  5. 不需要演员。

    // void* malloc(int size, int* bytesUsed, uchar* memory);
    void* malloc(size_t size, size_t* bytesUsed, uchar* memory);
    
  6. 使用// return (void*)(memory+startIdx); return memory + startIdx; unsigned char更明确,希望不是别的。

  7. 把这一切放在一起

    uchar

    此外,void* malloc(size_t size, size_t* bytesUsed, unsigned char* memory){ size = (size + sizeof(max_align_t) - 1)/sizeof(max_align_t)*sizeof(max_align_t); if (RG_ALLOC_SIZE - *bytesUsed > size) { return NULL; } size_t startIdx = *bytesUsed; // See note above concerning alignment. *bytesUsed += size; return memory + startIdx; } 未编码。如果需要,这种简单的分配方案需要大量增加。