러스트에서 할당자는 동적 메모리(힙)의 할당 및 해제를 담당합니다. 기본적으로 러스트는 표준 시스템 할당기를 사용하지만, 언어는 전역 및 지역 인터페이스를 통해 사용자 정의 할당기를 사용할 수 있는 기능을 제공합니다. 이러한 기능은 다음과 같은 상황에서 필요합니다:
버전 1.28부터 전역 할당기는 #[global_allocator] 속성을 통해 설정됩니다:
use std::alloc::System; #[global_allocator] static GLOBAL: System = System;
사용자 정의 할당기를 만들려면 std::alloc에서 트레이트를 구현하면 됩니다:
use std::alloc::{GlobalAlloc, Layout}; struct MyAlloc; unsafe impl GlobalAlloc for MyAlloc { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { // 할당 논리 std::alloc::System.alloc(layout) // 위임 } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { // 해제 논리 std::alloc::System.dealloc(ptr, layout) } } #[global_allocator] static GLOBAL: MyAlloc = MyAlloc;
질문: 런타임 중에 전역 할당기를 변경할 수 있나요? 예를 들어, 조건이나 구성에 따라?
답변: 아니요! 전역 할당기는 컴파일 타임에 선택되며 #[global_allocator]를 통해 정적으로 설정됩니다. 런타임 중에 변경하거나 동적으로 선택할 수 없으며, 이 속성은 컴파일 시 생성된 코드에 영향을 미칩니다.
이야기
Box::new 호출 시 세그멘트 오류와 함께 중단되었습니다. 정적 메모리 풀에 접근할 수 있는 사용자 정의 할당기를 구현하여 도와주었습니다.이야기
이야기
데스크톱 애플리케이션 개발에서 외부 할당기인 jemalloc을 사용했지만, rustc 버전 간의 ABI 차이를 고려하지 않았습니다. 이로 인해 서로 다른 코드 조각이 서로 다른 메모리 할당 규칙을 기대했다는 이유로 데이터 직렬화 시 불투명한 오류가 발생했습니다.