我正在用 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 字节。这是不好的做法吗?仅使用数组来增加结构体的大小似乎很奇怪。
最佳答案
我认为你的代码是不好的做法。
- 如果您有数组( block ),则不需要链表。
- 在 init 方法中调用
malloc(BLOCK_COUNT * sizeof(Object));
将 分配所有 block 。这将导致您的程序分配所有 开始时需要内存,这可能会浪费内存,如果 您并不确切知道您将需要多少内存。 - 您仍然需要管理池中的内存,因此没有必要拥有它。
您可能想做的是编写一个垃圾收集器。 然而,这并不是一件小事,需要很长时间才能在这里解释。
如果您不想这样做,我建议您使用不同的语言 内存管理。
否则您可能正在寻找具有以下形式的“变体”数组:
enum type {
TYPE_1,
...
};
struct Object {
enum type t;
union {
type_1 t1;
...
};
};
关于c - 在 C 中使用 char 数组填充结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55318901/