In Rust is een allocator verantwoordelijk voor het toewijzen en vrijgeven van dynamisch geheugen (heap). Standaard gebruikt Rust de standaard systeemallocator, maar de taal biedt de mogelijkheid om gebruikersallocators te gebruiken via globale en lokale interfaces. Dit kan nodig zijn voor:
Sinds versie 1.28 wordt de globale allocator ingesteld via het attribuut #[global_allocator]:
use std::alloc::System; #[global_allocator] static GLOBAL: System = System;
Je kunt je eigen allocator maken door traits van std::alloc te implementeren:
use std::alloc::{GlobalAlloc, Layout}; struct MyAlloc; unsafe impl GlobalAlloc for MyAlloc { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { // Hier is de toewijzingslogica std::alloc::System.alloc(layout) // delegeren } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { // Logica voor vrijgave std::alloc::System.dealloc(ptr, layout) } } #[global_allocator] static GLOBAL: MyAlloc = MyAlloc;
Vraag: Kun je de globale allocator op runtime veranderen, bijvoorbeeld afhankelijk van omstandigheden of configuratie?
Antwoord: Nee! De globale allocator wordt gekozen tijdens de compilatie en wordt statisch ingesteld via #[global_allocator]. Je kunt deze niet op runtime of dynamisch veranderen, omdat dit attribuut invloed heeft op de gegenereerde code tijdens de compilatie.
Verhaal
Box::new. De implementatie van een eigen allocator met toegang tot statische geheugenvijvers hielp.Verhaal
Verhaal
Bij de ontwikkeling van een desktopapplicatie werd een externe allocator jemalloc gebruikt, zonder rekening te houden met de ABI-verschillen tussen rustc-versies. Dit leidde tot moeilijk te traceren fouten bij het serialiseren van gegevens, aangezien verschillende codesecties verschillende afspraken over geheugentoewijzing verwachtten.