这个自定义 malloc 可以吗?

Is this custom malloc OK?

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

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

我是 C 编程的新手,我可能犯了与指针算术相关的错误或其他错误...这个想法是 bytesUsed 为您提供第一个空闲地址的 memory 的索引,因此您将其递增 size 然后 return 递增的索引作为指针。

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

#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. 最大的问题是对齐。返回的指针需要对齐。由于此 malloc() 未给出所需的指针类型,因此使用 max_align_t "which is an object type whose alignment is as great as is supported by the implementation in all contexts" C11dr §7.19 2. 注意:*bytesUsed 也需要此对齐。因此,如果其他代码影响它,则应应用类似的代码。

    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);
    
  2. 未检测到内存不足。

  3. 避免重复使用标准库名称。如果需要,代码可以 define 稍后添加。

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

    // void* malloc(int size, int* bytesUsed, uchar* memory);
    void* malloc(size_t size, size_t* bytesUsed, uchar* memory);
    
  5. 不需要转换。

    // return (void*)(memory+startIdx);
    return memory + startIdx;
    
  6. 使用 unsigned charuchar 更清楚,希望不是别的东西。

把这些放在一起

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;
}

另外,RG_free()没有编码。如果需要,这个简单的分配方案将需要大量增加。