c / expert
Snippet
Arena-Speicherallokation mit strikter Zeigerausrichtung
Ein Arena-Allocator nutzt lineare Bump-Allokation über einem festen Byte-Puffer, um Malloc-Overhead und Segmentierung zu vermeiden. Hochleistungssysteme erfordern an Hardware-Grenzen ausgerichtete Speicheradressen (z. B. 4 oder 8 Byte). Bitweise Arithmetik `(current + (align - 1)) & ~(align - 1)` rundet Zeiger effizient auf die nächste Ausrichtungsgrenze auf, bevor der Offset aktualisiert wird.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>#include <stdint.h>#include <stddef.h>typedef struct {uint8_t *buffer;size_t capacity;size_t offset;} Arena;void *arena_alloc(Arena *arena, size_t size, size_t alignment) {uintptr_t current_ptr = (uintptr_t)(arena->buffer + arena->offset);uintptr_t aligned_ptr = (current_ptr + (alignment - 1)) & ~(alignment - 1);size_t padding = aligned_ptr - current_ptr;if (arena->offset + padding + size > arena->capacity) return NULL;arena->offset += padding + size;return (void *)aligned_ptr;}int main(void) {uint8_t memory_pool[1024];Arena arena = { .buffer = memory_pool, .capacity = sizeof(memory_pool), .offset = 0 };double *val = (double *)arena_alloc(&arena, sizeof(double), _Alignof(double));if (val) {*val = 3.14159;printf("Allocated aligned double: %f at %p\n", *val, (void *)val);}return 0;}
Erklärung
1
uintptr_t current_ptr = (uintptr_t)(arena->buffer + arena->offset);
Wandelt aktuelle Offset-Adresse in Integer-Darstellung für bitweise Mathematik um.
2
uintptr_t aligned_ptr = (current_ptr + (alignment - 1)) & ~(alignment - 1);
Wendet bitweise UND-Maskierung an, um die Adresse auf die nächste 2er-Potenz-Grenze aufzurunden.
3
*val = (double *)arena_alloc(&arena, sizeof(double), _Alignof(double));
Fordert Speicher mit Ausrichtungsanforderung an, die mittels C11 _Alignof-Operator ermittelt wird.