C 언어, 현대적인 할당자(Allocator)를 만나다!
C 언어에서 메모리 할당을 위한 표준 라이브러리(Standard Library)의 한계를 지적하고, 현대 언어의 할당자 설계 방식을 소개함
Rust, Zig, Odin, C3, Hare 등 다양한 언어의 할당자 인터페이스(Allocator Interface)를 비교 분석하여 C 언어에서의 구현 방향성을 제시함
C 언어에서 Zig 스타일의 할당자 인터페이스를 구현하는 방법을 제시하고, 힙(heap) 및 아레나(arena) 할당자를 예시로 제공함
커뮤니티에서는 Zig의 할당자 사용 방식이 함수를 '색칠(coloring)'한다는 표현에 대한 다양한 의견(Various Opinions)이 제시됨
C 언어 할당자 인터페이스 설계
저자는 C 언어에서 현대적인 할당자 설계를 위해 Zig의 방식을 차용하여, `alloc`, `realloc`, `free` 메서드를 갖는 인터페이스를 정의한다. 특히, 오류 처리를 위해 `Error` 열거형과 `AllocResult` 구조체를 사용하여 메모리 할당 실패(Memory Allocation Failure)를 명시적으로 처리하도록 설계했다. 이러한 접근 방식은 C 언어에서 메모리 관리의 안전성을 높이는 데 기여할 수 있다.
아레나 할당자(Arena Allocator) 구현
저자는 고정 크기 버퍼를 기반으로 하는 아레나 할당자를 C 언어로 구현하는 방법을 제시한다. 아레나 할당자는 할당된 메모리를 개별적으로 해제하는 대신, 전체 버퍼를 한 번에 해제하는 방식으로 설계되어 메모리 할당/해제 오버헤드(Memory Allocation/Deallocation Overhead)를 줄일 수 있다. 또한, `Arena_Reset` 함수를 통해 버퍼를 초기화하여 메모리 재사용을 가능하게 한다.
Zig의 할당자(Allocator) 사용 방식 논쟁
커뮤니티에서는 Zig의 할당자 사용 방식이 함수를 '색칠(coloring)'한다는 표현에 대한 논의가 있었다. 이는 할당자를 인자로 받는 'red' 함수와 그렇지 않은 'blue' 함수 간의 상호 작용에 대한 문제 제기이다. 함수 시그니처(Function Signature)에 따라 함수가 구분되는 것은 불가피하며, blue 함수가 필요에 따라 할당자를 생성하여 red 함수에 전달할 수 있다는 반론도 제기되었다.
Rust, Zig, Odin, C3, Hare의 할당자 비교
글에서는 Rust, Zig, Odin, C3, Hare의 할당자 인터페이스를 비교 분석하여 각 언어의 특징을 설명한다. Rust는 전역 할당자(Global Allocator)를 사용하며, Zig는 명시적인 할당자 전달 방식을, Odin과 C3는 컨텍스트 기반의 할당자 사용을 지원한다. Hare는 단일 전역 할당자를 사용한다. 이러한 비교를 통해 C 언어에서 다양한 할당자 구현 방식을 이해하고, 적절한 선택을 할 수 있도록 돕는다.