alloc
Щоб використовувати alloc
, ви повинні реалізувати глобальний розподільник (кучі).
#![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() { // БЕЗПЕКА: `HEAP` використовується тільки тут і `entry` викликається тільки один раз. unsafe { // Дати розподільнику трохи пам'яті для виділення. HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len()); } // Тепер ми можемо робити речі, які вимагають виділення кучі. let mut v = Vec::new(); v.push("Рядок".to_string()); }
buddy_system_allocator
— це сторонній крейт, який реалізує базовий системний розподільник між друзями. Доступні інші крейти, або ви можете написати свій власний або підключити до наявного розподільника.- Параметр const у
LockedHeap
- це максимальний порядок розподільника, тобто у цьому випадку він може виділяти області розміром до 2**32 байт. - Якщо будь-який крейт у вашому дереві залежностей залежить від
alloc
, тоді ви повинні мати точно один глобальний розподільник, визначений у вашому бінарному файлі. Зазвичай це робиться у бінарному крейті верхнього рівня. extern crate panic_halt as _
необхідний для того, щоб переконатися, що буде зв'язано крейтpanic_halt
і ми отримаємо його обробник паніки.- Цей приклад збиратиметься, але не запускатиметься, оскільки він не має точки входу.