typestar

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

  1. Asignar es empujar un puntero, así que es muy rápido.
  2. Nada se libera individualmente; la arena entera se va de una vez.
  3. La alineación se maneja redondeando el desplazamiento hacia arriba.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 3 de 4 en Propiedad y errores; paso 17 de 25 en Punteros y memoria.

← Anterior Siguiente →