我正在用C编写一个简单的解释器,我不想处理内存管理,因此我正在编写一个简单的内存池来跟踪和减少malloc和free的数量。
typedef struct object {
Type type;
char data[128];
struct object* next;
} Object;
typedef struct pool {
Object* head;
unsigned int used;
Object* blocks;
} Pool;
如您所见,我的内存池当前只是“对象”的链接列表,每个对象的大小为128字节。
我的init和malloc函数如下:
#define BLOCK_COUNT 256
void* mp_init() {
Pool* mp = malloc(1 * sizeof(Pool));
mp->blocks = malloc(BLOCK_COUNT * sizeof(Object));
mp->head = mp->blocks;
mp->blocks->next = NULL;
mp->used = 0;
return mp;
}
void* mp_malloc(Pool* mp) {
Object* obj = NULL;
obj = (mp->blocks + mp->used);
obj->next = (mp->blocks + (mp->used + 1) );
obj->next->next = NULL;
mp->used++;
return obj;
}
我正在使用char data[128]
来强制我的所有对象的大小为128字节,我的malloc函数返回每个对象的地址,并在这128个字节中存储我想要的任何内容。这是不好的做法吗?使用数组来增加结构的大小似乎很奇怪。
我会考虑你的代码不好的做法。
malloc(BLOCK_COUNT * sizeof(Object));
将分配所有块。这将导致程序在开始时分配所有需要的内存,如果您不确切知道需要多少内存,这可能会浪费内存。你可能想要做的是写一个垃圾收集器。然而,这不是微不足道的,需要很长时间来解释。
如果您不想进行内存管理,我建议您使用其他语言。
否则你可能正在寻找的是具有以下形式的“变体”数组:
enum type {
TYPE_1,
...
};
struct Object {
enum type t;
union {
type_1 t1;
...
};
};
如果满足以下条件,可以在初始化期间分配应用程序所需的所有内存:
是否是一种好的做法取决于您正在使用的应用程序类型。从你发布的代码片段我想提出几点意见:
简而言之,只有当您的内存管理器足够强大以处理所有上述场景时,实现您自己的内存管理模型才是一个好习惯。请记住,在大型应用程序中,内存管理器中的错误可能很难检测到。