Я пишу простой интерпретатор в 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 байтах. Это плохая практика? Кажется странным просто использовать массив для увеличения размера структуры.