我需要一个简单而有效的内存分配算法

时间:2012-01-16 14:09:10

标签: c linux gcc x86-64

我正在尝试实现自己的内存分配代码,这个代码简单而有效。知道我可以从哪里开始。 gcc使用什么算法?

4 个答案:

答案 0 :(得分:7)

这是一个已经过数百次检查和实施的问题;很有可能你的实施工作将在非常具体的情况下发挥作用。在花费大量时间尝试自己解决这个问题之前,请考虑现有的实现超过gcc的通用分配机制:

http://goog-perftools.sourceforge.net/doc/tcmalloc.html

http://www.canonware.com/jemalloc/

您还可以通过查看源版本来查看GCC / glibc本身的实现:

http://gcc.gnu.org/releases.html

http://ftp.gnu.org/gnu/glibc/

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

请注意,内存需要按照为其分配的顺序释放。