我正在尝试实现自己的内存分配代码,这个代码简单而有效。知道我可以从哪里开始。 gcc使用什么算法?
答案 0 :(得分:7)
这是一个已经过数百次检查和实施的问题;很有可能你的实施工作将在非常具体的情况下发挥作用。在花费大量时间尝试自己解决这个问题之前,请考虑现有的实现超过gcc的通用分配机制:
http://goog-perftools.sourceforge.net/doc/tcmalloc.html
http://www.canonware.com/jemalloc/
您还可以通过查看源版本来查看GCC / glibc本身的实现:
http://gcc.gnu.org/releases.html
Malloc是GNU C Library实现的一部分。
答案 1 :(得分:5)
始终为NULL的malloc
符合标准的字母。所以我建议
/* always return NULL, following the letter but not the spirit
of the standard */
inline void *malloc(size_t sz)
{ errno = ENOMEM;
return NULL; }
如果速度是您的主要标准,那么效率相当高。我并不认为它有用,但你没有要求有用。
真实malloc
很复杂,因为它们试图变得有用和高效。它们通常构建在现有syscalls之上(如Linux上的mmap(2),munmap
等),并且它们经常尝试重用已释放的内存。研究例如相关的源代码GNU libc或musl libc
答案 2 :(得分:2)
GCC使用malloc(),由目标平台的C库提供。对于Linux,您可以在这里找到GNU C库中malloc的实现:http://repo.or.cz/w/glibc.git/blob/HEAD:/malloc/malloc.c
对于通用分配器,你不太可能做得更好,而且非常可能更糟糕,因为默认分配器已针对许多不同的使用场景进行了多年的调整。
对于某些特殊用途的分配器,那么肯定可以击败通用分配器。
答案 3 :(得分:1)
如果你想要一个非常简单的方法:
// 1 KB of data that can be allocated
#define MAX_DATA 1024
char pointers[MAX_DATA];
int currentOffset = 0;
int ptrNum = 0;
int sizes[MAX_DATA];
void *malloc(int numBytes)
{
char *ptr = pointers + currentOffset;
currentOffset += numBytes;
if (currentOffset >= MAX_DATA)
return NULL;
sizes[ptrNum++] = numBytes;
return ptr;
}
void free(void *ptr)
{
currentOffset -= sizes[ptrNum--];
}
请注意,内存需要按照为其分配的顺序释放。