Un asignador de arena en C
Un bloque grande, un puntero que avanza y un solo free al final.
#include <stdlib.h>
typedef struct {
unsigned char *base;
size_t used;
size_t cap;
} Arena;
int arena_init(Arena *a, size_t cap) {
a->base = malloc(cap);
a->used = 0;
a->cap = (a->base == NULL) ? 0 : cap;
return a->base != NULL;
}
void *arena_alloc(Arena *a, size_t n) {
size_t aligned = (a->used + 15u) & ~(size_t) 15u;
if (aligned + n > a->cap) {
return NULL;
}
a->used = aligned + n;
return a->base + aligned;
}
void arena_free(Arena *a) {
free(a->base);
a->base = NULL;
a->used = 0;
a->cap = 0;
}
Cómo funciona
- Asignar es empujar un puntero, así que es muy rápido.
- Nada se libera individualmente; la arena entera se va de una vez.
- La alineación se maneja redondeando el desplazamiento hacia arriba.
Palabras clave y builtins usados aquí
NULLcharifintreturnsize_tstructtypedefunsignedvoid
El intento, en números
- Líneas
- 30
- Caracteres a escribir
- 504
- Tokens
- 179
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 107 segundos.
Paso 3 de 4 en Propiedad y errores; paso 17 de 25 en Punteros y memoria.