In Rust ist der Allokator verantwortlich für die Zuweisung und Freigabe von dynamischem Speicher (Heap). Standardmäßig verwendet Rust den systemeigenen Allokator, aber die Sprache bietet die Möglichkeit, benutzerdefinierte Allokatoren über globale und lokale Schnittstellen zu verwenden. Dies kann notwendig sein für:
Seit 1.28 wird der globale Allokator über das Attribut #[global_allocator] definiert:
use std::alloc::System; #[global_allocator] static GLOBAL: System = System;
Man kann einen eigenen Allokator erstellen, indem man Traits aus std::alloc implementiert:
use std::alloc::{GlobalAlloc, Layout}; struct MyAlloc; unsafe impl GlobalAlloc for MyAlloc { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { // Hier Logik zur Zuweisung std::alloc::System.alloc(layout) // delegieren } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { // Logik zur Freigabe std::alloc::System.dealloc(ptr, layout) } } #[global_allocator] static GLOBAL: MyAlloc = MyAlloc;
Frage: Kann man den globalen Allokator zur Laufzeit ändern, z. B. je nach Bedingungen oder Konfiguration?
Antwort: Nein! Der globale Allokator wird zur Kompilierzeit ausgewählt und statisch über #[global_allocator] festgelegt. Er kann zur Laufzeit nicht geändert oder dynamisch ausgewählt werden, da dieses Attribut den generierten Code bei der Kompilierung beeinflusst.
Geschichte
Box::new. Die Implementierung eines eigenen Allokators mit Zugriff auf statische Speicherpools half.Geschichte
Geschichte
Bei der Entwicklung einer Desktop-Anwendung wurde ein Drittanbieter-Allokator jemalloc verwendet, ohne die Unterschiede in der ABI zwischen den rustc-Versionen zu berücksichtigen. Dies führte zu schwer fassbaren Fehlern bei der Serialisierung von Daten, da verschiedene Teile des Codes unterschiedliche Vereinbarungen zur Speicherzuweisung erwarteten.