我需要为GPU编程编写一个自定义malloc。这会正常工作吗?
void* malloc(int size, int* bytesUsed, uchar* memory){
int startIdx = (*bytesUsed);
(*bytesUsed) += size;
return (void*)(memory+startIdx);
}
我是C编程新手,我可能已经做过与指针算术相关的错误或者其他什么......想法是bytesUsed
给你第一个空闲地址memory
的索引,所以你将它递增size
,然后将递增的索引作为指针返回。
答案 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)
有一些问题:
最大的问题是对齐。返回的指针需要对齐。由于没有给出malloc()
所需的指针类型,因此使用max_align_t
“这是一种对象类型,其对齐方式与所有上下文中的实现所支持的一样大”C11dr§7.192。注意:{ {1}}也需要这种对齐方式。因此,如果其他代码影响它,则应用类似的代码。
*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);
。
define
// 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
不需要演员。
// void* malloc(int size, int* bytesUsed, uchar* memory);
void* malloc(size_t size, size_t* bytesUsed, uchar* memory);
使用// return (void*)(memory+startIdx);
return memory + startIdx;
比unsigned char
更明确,希望不是别的。
把这一切放在一起
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;
}
未编码。如果需要,这种简单的分配方案需要大量增加。