alloc
Para utilizar alloc
, debes implementar un asignador global (de heap).
#![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 { // Proporciona al asignador algo de memoria para asignar. HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len()); } // Ahora podemos llevar a cabo acciones que requieran la asignación de montículo. let mut v = Vec::new(); v.push("A string".to_string()); }
buddy_system_allocator
es un crate de terceros que implementa un buddy system allocator (una técnica de asignación de memoria) básico. Hay otros crates disponibles, pero también puedes escribir el tuyo propio o conectarte a tu asignador.- El parámetro const de
LockedHeap
es el orden máximo del asignador. Es decir, en este caso, puede asignar regiones de hasta 2**32 bytes. - Si algún crate del árbol de dependencias depende de
alloc
, debes tener exactamente un asignador global definido en el binario. Esto se suele hacer en el crate binario de nivel superior. extern crate panic_halt as _
es necesario para asegurar que el cratepanic_halt
esté vinculado y así podamos obtener su controlador de panic.- Este ejemplo se compilará pero no se ejecutará, ya que no cuenta con un punto de entrada.