В Rust аллокатор отвечает за распределение и освобождение динамической памяти (heap). По умолчанию Rust использует стандартный системный аллокатор, но язык предоставляет возможность использовать пользовательские аллокаторы через глобальный и локальный интерфейсы. Это бывает нужно для:
С 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]. Нельзя поменять его в рантайме или выбрать динамически, так как этот атрибут влияет на generated code при компиляции.
История
Box::new. Помогла реализация собственного аллокатора с доступом к статическому пулам памяти.История
История
При разработке desktop-приложения применили сторонний аллокатор jemalloc, не учли разницу ABI между rustc-версиями. Это привело к трудноуловимым сбоям при сериализации данных, ведь разные участки кода ожидали разные соглашения о выделении памяти.