这个自定义 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
,因为你说你不需要解除分配。
存在一些问题:
最大的问题是对齐。返回的指针需要对齐。由于此 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);
未检测到内存不足。
避免重复使用标准库名称。如果需要,代码可以 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;
}
另外,RG_free()
没有编码。如果需要,这个简单的分配方案将需要大量增加。
我需要为 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
,因为你说你不需要解除分配。
存在一些问题:
最大的问题是对齐。返回的指针需要对齐。由于此
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);
未检测到内存不足。
避免重复使用标准库名称。如果需要,代码可以
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;
}
另外,RG_free()
没有编码。如果需要,这个简单的分配方案将需要大量增加。