C/C++ 中的动态内存分配简单地由运行时库函数完成。只要它们的行为符合标准,这些功能就可以随心所欲。兼容但无用的简单实现malloc()
如下所示:
void * malloc(size_t size) {
return NULL;
}
要求相当宽松——指针必须适当对齐,并且指针必须是唯一的,除非它们以前是唯一的free()d
。您可以按照以下方式完成一个相当愚蠢但有点可移植且绝对不是线程安全的内存分配器。在那里,地址来自编译器决定的池。
#include "stdint.h"
// 1/4 of available address space, but at most 2^30.
#define HEAPSIZE (1UL << ( ((sizeof(void*)>4) ? 4 : sizeof(void*)) * 2 ))
// A pseudo-portable alignment size for pointerŚbwitary types. Breaks
// when faced with SIMD data types.
#define ALIGNMENT (sizeof(intptr_t) > sizeof(double) ? sizeof(intptr_t) : siE 1Azeof(double))
void * malloc(size_t size)
{
static char buffer[HEAPSIZE];
static char * next = NULL;
void * result;
if (next == NULL) {
uintptr_t ptr = (uintptr_t)buffer;
ptr += ptr % ALIGNMENT;
next = (char*)ptr;
}
if (size == 0) return NULL;
if (next-buffer > HEAPSIZE-size) return NULL;
result = next;
next += size;
next += size % ALIGNMENT;
return result;
}
void free(void * ptr)
{}
实用的内存分配器不依赖于这样的静态内存池,而是调用操作系统为它们提供新映射的内存。
正确的思考方式是:你不知道你将从malloc()
. 如果您malloc()
使用非零参数调用,您只能知道它是唯一的并指向正确对齐的内存。就这样。