Rust'ta allocator, dinamik belleği (heap) dağıtmak ve serbest bırakmakla sorumludur. Varsayılan olarak Rust, standart sistem allocator'ını kullanır, ancak dil, küresel ve yerel arayüzler aracılığıyla kullanıcı tanımlı allocator'ları kullanma imkanı sunar. Bu genellikle şunlar için gereklidir:
1.28 sürümünden itibaren küresel allocator, #[global_allocator] niteliği aracılığıyla ayarlanır:
use std::alloc::System; #[global_allocator] static GLOBAL: System = System;
Kendi allocator'ınızı oluşturmak için std::alloc içindeki trait'leri uygulayabilirsiniz:
use std::alloc::{GlobalAlloc, Layout}; struct MyAlloc; unsafe impl GlobalAlloc for MyAlloc { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { // Burada tahsis mantığı std::alloc::System.alloc(layout) // devret } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { // Serbest bırakma mantığı std::alloc::System.dealloc(ptr, layout) } } #[global_allocator] static GLOBAL: MyAlloc = MyAlloc;
Soru: Küresel allocator'ı çalışma zamanında koşullara veya yapılandırmaya bağlı olarak değiştirmek mümkün mü?
Cevap: Hayır! Küresel allocator, derleme aşamasında seçilir ve #[global_allocator] niteliği ile statik olarak belirlenir. Bunu çalışma zamanında değiştirmek veya dinamik olarak seçmek mümkün değildir, çünkü bu nitelik derleme sırasında oluşturulan kodu etkiler.
Hikaye
Box::new işleminde segfault ile çöküyordu. Statik bellek havuzlarına erişim ile kendi allocator'larının uygulanması yardımcı oldu.Hikaye
Hikaye
Masaüstü uygulaması geliştirirken, tarafsız bir allocator jemalloc kullandılar, rustc sürümleri arasındaki ABI farkını dikkate almadılar. Bu, veri serileştirmede zorlayıcı hatalara neden oldu, çünkü farklı kod parçaları bellek tahsisinde farklı kurallar bekliyordu.