#include #include #include #include #include #include struct arena { FILE *stream; char *buffer; size_t offset; size_t size; }; void arena_create(struct arena *arena) { *arena = (struct arena){open_memstream(&arena->buffer, &arena->size)}; } void arena_destroy(struct arena *arena) { fclose(arena->stream); 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 (data) { fwrite(data, 1, size, arena->stream); } arena->offset += size; return offset; } static inline void *arena_get(struct arena const *arena, size_t offset) { fflush(arena->stream); 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); }