간단한 범프 할당자
메모리를 선형으로 나누어 보세요.
간단한 범프 할당자은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
범프 할당자의 개념
범프 또는 아레나 할당자는 가장 단순한 설계입니다. 큰 버퍼 하나와 단일 오프셋을 유지합니다. 각 할당은 현재 오프셋을 반환한 다음 요청된 크기만큼 오프셋을 앞으로 "밀어 올립니다".
block별 메타데이터나 검색이 없습니다. 할당은 사실상 포인터 덧셈 한 번이므로 매우 빠릅니다.
정적 기반 버퍼
독립적으로 실행되는 예제를 위해 할당자를 OS 힙 대신 정적 배열로 뒷받침합니다. sbrk나 mmap 없이 어디서나 컴파일하고 실행할 수 있습니다.
이 배열은 나누어 사용할 수 있는 고정된 바이트 풀을 제공합니다.
#define POOL_SIZE 1024
static unsigned char pool[POOL_SIZE];
static size_t offset = 0;핵심 범프 함수
할당 함수는 충분한 공간이 남아 있는지 확인하고 시작 위치를 기록한 다음 오프셋을 이동하고 시작 포인터를 반환합니다. 요청으로 인해 풀이 넘치면 NULL을 반환합니다.
이 넘침 검사가 범프 할당자가 제공하는 유일한 안전 장치입니다.
void *bump_alloc(size_t size) {
if (offset + size > POOL_SIZE)
return NULL; /* out of pool */
void *p = &pool[offset];
offset += size;
return p;
}완전하게 실행할 수 있는 범프 할당자
다음은 완전한 프로그램입니다. 풀에서 정수 두 개와 짧은 문자열 하나를 할당하고 출력하여 할당자가 작동함을 보여 줍니다.
실제 malloc에 비해 코드가 얼마나 적게 필요한지 살펴보십시오.
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#define POOL_SIZE 1024
static unsigned char pool[POOL_SIZE];
static size_t offset = 0;
void *bump_alloc(size_t size) {
if (offset + size > POOL_SIZE) return NULL;
void *p = &pool[offset];
offset += size;
return p;
}
int main(void) {
int *a = bump_alloc(sizeof(int));
int *b = bump_alloc(sizeof(int));
char *s = bump_alloc(6);
*a = 10; *b = 32;
strcpy(s, "hi");
printf("%d %d %s\n", *a, *b, s);
printf("used = %zu\n", offset);
return 0;
}개별 해제 불가
단점은 범프 할당자가 개별 할당을 해제할 수 없다는 것입니다. 메타데이터가 없으므로 재사용을 위해 한 block이 끝나고 다음 block이 시작되는 위치를 알 수 없습니다.
오프셋을 0으로 되돌려 전체 아레나를 한 번에 초기화하는 방법만 사용할 수 있습니다.
void bump_reset(void) {
offset = 0; /* frees everything at once */
}초기화가 유용한 이유
이러한 전부 아니면 전무 방식은 단계 기반 작업에 적합합니다. 요청이나 프레임 중에 많은 객체를 할당한 다음 단계가 끝나면 아레나를 초기화하는 것입니다.
게임 엔진과 컴파일러는 초기화가 O(1)이고 수천 개의 개별 해제를 추적할 필요가 없기 때문에 아레나를 많이 사용합니다.
/* Per-frame pattern */
for (int frame = 0; frame < 3; frame++) {
void *tmp = bump_alloc(128);
/* ... use tmp this frame ... */
bump_reset(); /* reclaim instantly */
}남은 공간 추적
남은 공간이 얼마나 되는지 제공하면 편리합니다. 이는 단순히 풀 크기에서 현재 오프셋을 뺀 값입니다.
호출자는 이 값을 사용해 더 요청하기 전에 내용을 비우거나 공간을 확장할지 결정할 수 있습니다.
size_t bump_remaining(void) {
return POOL_SIZE - offset;
}실행 가능한 리셋 데모
이 프로그램은 풀의 일부를 채우고 사용량을 출력한 다음 리셋합니다. 그런 뒤 오프셋이 0으로 돌아가 공간을 다시 사용할 수 있음을 보여 줍니다.
#include <stdio.h>
#include <stddef.h>
#define POOL_SIZE 256
static unsigned char pool[POOL_SIZE];
static size_t offset = 0;
void *bump_alloc(size_t s){ if(offset+s>POOL_SIZE) return NULL; void *p=&pool[offset]; offset+=s; return p; }
void bump_reset(void){ offset = 0; }
int main(void) {
bump_alloc(100);
printf("after alloc: used=%zu\n", offset);
bump_reset();
printf("after reset: used=%zu\n", offset);
return 0;
}범프 할당기의 정렬
바이트 단위로 단순히 범프하면 정렬되지 않은 포인터가 반환될 수 있습니다. 안전하게 사용하려면 포인터를 반환하기 전에 오프셋을 정렬 경계까지 올림해야 합니다.
수학적 원리는 뒤에서 자세히 다루겠지만, 범프 할당기에서는 별도의 패딩이 없기 때문에 정렬이 특히 중요합니다.
static size_t align_up(size_t n, size_t a) {
return (n + a - 1) & ~(a - 1); /* a must be power of 2 */
}정렬된 범프 할당기
각 할당 전에 오프셋을 정렬하도록 구성 요소를 결합합니다. 이렇게 하면 반환되는 모든 포인터가 일반적인 모든 형식에 적합해집니다.
그 대가로 패딩 바이트 때문에 약간의 내부 단편화가 발생합니다.
#define ALIGN 16
void *bump_aligned(size_t size) {
offset = align_up(offset, ALIGN);
if (offset + size > POOL_SIZE) return NULL;
void *p = &pool[offset];
offset += size;
return p;
}장점과 한계
범프 할당기는 비할 데 없이 빠르고 매우 단순하며, 객체마다 추가 비용이 전혀 없습니다. 객체들이 같은 수명을 공유할 때 이상적입니다.
단점은 세밀하게 해제할 수 없다는 점입니다. 수명이 서로 다르면 다음 레슨에서 다루는 자유 목록 설계가 필요합니다.
빠른 확인
범프 할당기가 메모리를 어떻게 회수하는지 생각해 보세요.
복습
범프 할당기는 버퍼 안에서 하나의 오프셋을 이동시켜 메모리를 나누어 주므로, 할당 비용이 포인터 덧셈만큼 저렴합니다.
속도와 단순성을 얻는 대신 개별 해제를 포기하고, 전체 리셋을 통해서만 메모리를 회수합니다. 반환되는 포인터가 모든 형식에 유효하도록 오프셋을 정렬해야 합니다.
자주 묻는 질문
“간단한 범프 할당자” 강의는 무료인가요?
네 — “간단한 범프 할당자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“간단한 범프 할당자”에서 뭘 배우나요?
메모리를 선형으로 나누어 보세요. 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“간단한 범프 할당자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- malloc이 작동하는 방식
- 간단한 범프 할당자
- 사용 가능 목록과 재사용
- 정렬과 분할