alloc
برای استفاده از alloc
باید یک global (heap) allocator را پیادهسازی کنید.
#![no_main] #![no_std] extern crate alloc; extern crate panic_halt as _; use alloc::string::ToString; use alloc::vec::Vec; use buddy_system_allocator::LockedHeap; #[global_allocator] static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new(); static mut HEAP: [u8; 65536] = [0; 65536]; pub fn entry() { // SAFETY: `HEAP` is only used here and `entry` is only called once. unsafe { // Give the allocator some memory to allocate. HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len()); } // Now we can do things that require heap allocation. let mut v = Vec::new(); v.push("A string".to_string()); }
buddy_system_allocator
یک third-party crate است که یک تخصیصدهنده buddy system را پیادهسازی میکند. crateهای دیگر در دسترس هستند یا میتوانید نسخه مربوط به خود را بنویسید یا به تخصیص دهنده موجود خود متصل کنید.- پارامتر const
LockedHeap
حداکثر ترتیب تخصیصدهنده (allocator) است. یعنی در این مورد میتواند مناطقی تا 2**32 بایت را اختصاص دهد. - اگر هر crate ای در درخت وابستگی شما به
alloc
بستگی دارد، باید دقیقاً یک تخصیصدهنده سراسری در باینری خود تعریف کنید. معمولاً این کار در binary crate سطح بالا انجام میشود. - برای اطمینان از اینکه
panic_halt
crate لینک شده است، استفادهextern crate panic_halt as _
ضروری است، بنابراین panic handler آن را دریافت میکنیم. - این مثال ساخته می شود اما اجرا نمیشود، زیرا entry point ندارد.