这个自定义malloc可以吗?

qeeaahzv  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(74)

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

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

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

3phpmpom

3phpmpom1#

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

#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,因为你说你不需要释放。

jqjz2hbq

jqjz2hbq2#

[Edit 2023] sizeof(max_align_t)更正为alignof(max_align_t)
存在一些问题:
1.最大的问题是对齐。返回的指针需要对齐。因为这个malloc()没有给出所需的指针类型,所以使用max_align_t“这是一个对象类型,其对齐程度与所有上下文中的实现所支持的一样大”C11dr §7.19 2。注意:*bytesUsed也需要这种对齐。因此,如果其他代码影响它,则应应用类似的代码。

if (size%alignof(max_align_t)) {
   size += alignof(max_align_t) - size%alignof(max_align_t);
 }
 // or
 size = (size + alignof(max_align_t) - 1)/alignof(max_align_t)*alignof(max_align_t);

字符串
1.未检测到内存不足。
1.避免重复使用标准库名称。如果需要的话,代码可以在以后define它们。

// void* malloc(int size, int* bytesUsed, uchar* memory);
 void* RG_malloc(int size, int* bytesUsed, uchar* memory);

 // if needed
 #define malloc RF_malloc

  1. malloc()需要不同的分配类型:size_t,而不是int
// void* malloc(int size, int* bytesUsed, uchar* memory);
 void* malloc(size_t size, size_t* bytesUsed, uchar* memory);


1.不需要转换。

// return (void*)(memory+startIdx);
 return memory + startIdx;


1.使用unsigned char比使用uchar更清楚,希望不是别的东西。
把这一切放在一起

void* malloc(size_t size, size_t* bytesUsed, unsigned char* memory){
  size = (size + alignof(max_align_t) - 1)/alignof(max_align_t)*alignof(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()未被编码。如果需要的话,这种简单的分配方案将需要大量的补充。

相关问题