C / raylib
Advanced
C99 / C11
게임 프레임 단위를 위한 초고속 C 언어 선형 아레나 메모리 할당기(Arena Allocator)
malloc/free 반복으로 인한 힙 단편화와 시스템 콜 오버헤드를 제거하고, 프레임 종료 시 포인터 오프셋 하나만 0으로 리셋하는 무비용 해제 메모리 아레나.
#C #Memory Management #Optimization #Low Level #Performance
핵심 개념매 프레임 임시 생성되는 수백 개의 적 총알, 파티클, UI 텍스트 포맷팅을 매번
malloc과 free로 처리하면 힙 단편화와 캐시 미스가 발생합니다. 거대한 단일 메모리 블록을 예약하고 포인터 오프셋만 전진시키는 아레나(Arena)를 사용하면 할당은 단 1개의 덧셈 연산, 해제는 오프셋 0 초기화로 종결됩니다.1. 메모리 정렬을 지원하는 아레나 구현
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
typedef struct {
uint8_t *buffer;
size_t capacity;
size_t offset;
} Arena;
Arena arena_create(size_t capacity) {
Arena a;
a.buffer = (uint8_t *)malloc(capacity);
assert(a.buffer != NULL);
a.capacity = capacity;
a.offset = 0;
return a;
}
// 8바이트 메모리 정렬을 고려한 할당
void *arena_alloc(Arena *a, size_t size) {
size_t aligned_offset = (a->offset + 7) & ~7; // 8-byte align
if (aligned_offset + size > a->capacity) {
return NULL; // OOM (Out Of Memory)
}
void *ptr = &a->buffer[aligned_offset];
a->offset = aligned_offset + size;
return ptr;
}
// 프레임 종료 시 O(1) 무비용 전체 해제
void arena_reset(Arena *a) {
a->offset = 0;
}
void arena_destroy(Arena *a) {
free(a->buffer);
a->buffer = NULL;
a->capacity = 0;
a->offset = 0;
}