W Rust alokator odpowiada za przydział i zwalnianie dynamicznej pamięci (heap). Domyślnie Rust używa standardowego alokatora systemowego, ale język daje możliwość korzystania z niestandardowych alokatorów przez globalne i lokalne interfejsy. Może to być potrzebne do:
Od wersji 1.28 globalny alokator jest definiowany za pomocą atrybutu #[global_allocator]:
use std::alloc::System; #[global_allocator] static GLOBAL: System = System;
Można stworzyć własny alokator, implementując traity z std::alloc:
use std::alloc::{GlobalAlloc, Layout}; struct MyAlloc; unsafe impl GlobalAlloc for MyAlloc { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { // Logika alokacji std::alloc::System.alloc(layout) // delegujemy } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { // Logika zwalniania std::alloc::System.dealloc(ptr, layout) } } #[global_allocator] static GLOBAL: MyAlloc = MyAlloc;
Pytanie: Czy można zmienić globalny alokator w czasie wykonywania, na przykład, w zależności od warunków lub konfiguracji?
Odpowiedź: Nie! Globalny alokator jest wybierany na etapie kompilacji i jest ustawiany statycznie przez #[global_allocator]. Nie można go zmienić w czasie działania ani wybrać dynamicznie, ponieważ ten atrybut wpływa na generowany kod podczas kompilacji.
Historia
Box::new. Pomogła realizacja własnego alokatora z dostępem do statycznych puli pamięci.Historia
Historia
Podczas tworzenia aplikacji desktopowej zastosowano zewnętrzny alokator jemalloc, nie uwzględniając różnicy ABI między wersjami rustc. To doprowadziło do trudnych do uchwycenia awarii podczas serializacji danych, ponieważ różne części kodu oczekiwały różnych konwencji alokacji pamięci.