#include #include #include #include #include #include struct arena { void *buffer; size_t offset; size_t size; }; void arena_create(struct arena *arena) { unsigned long const init_size = 4ul * 1024ul; *arena = (struct arena){ .buffer = malloc(init_size), .size = init_size, }; } void arena_destroy(struct arena *arena) { free(arena->buffer); *arena = (struct arena){0}; } size_t arena_add(struct arena *arena, void const *data, size_t const size) { size_t const offset = arena->offset; if (size + offset > arena->size) { arena->size = (size + offset) * 1.5; arena->buffer = realloc(arena->buffer, arena->size); assert(arena->buffer); } if (data) { memcpy(arena->buffer + offset, data, size); } arena->offset += size; return offset; } static inline void *arena_get(struct arena const *arena, size_t offset) { return arena->buffer + offset; } int main(int argc, char * const argv[]) { (void)argc; (void)argv; struct arena arena; arena_create(&arena); unsigned data[4] = {1u, 2u, 3u, 4u}; for (size_t i = 0; i < 50000000lu; i++) { size_t const offset = arena_add(&arena, data, sizeof(data)); data[0] = (uintptr_t)arena_get(&arena, offset); } arena_destroy(&arena); }