alloc

Para usar alloc, vocĂȘ deve implementar um alocador global (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() {
    // Seguro porque `HEAP` Ă© usado apenas aqui e `entry` Ă© chamado apenas uma vez.
    unsafe {
        // DĂȘ ao alocador alguma memĂłria para alocar.
        HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len());
    }

    // Agora podemos fazer coisas que exigem alocação de heap.
    let mut v = Vec::new();
    v.push("Uma string".to_string());
}
  • buddy_system_allocator Ă© um crate de terceiros que implementa um alocador bĂĄsico de sistema de buddy. Outros crates estĂŁo disponĂ­veis, ou vocĂȘ pode escrever o seu prĂłprio ou conectar-se ao seu alocador existente.
  • O parĂąmetro const de LockedHeap Ă© a ordem mĂĄxima do alocador; ou seja, neste caso, ele pode alocar regiĂ”es de atĂ© 2**32 bytes.
  • Se algum crate na sua ĂĄrvore de dependĂȘncias depender de alloc, vocĂȘ deve ter exatamente um alocador global definido no seu binĂĄrio. Normalmente, isso Ă© feito no crate binĂĄrio de mais alto nĂ­vel.
  • extern crate panic_halt as _ Ă© necessĂĄrio para garantir que o crate panic_halt seja vinculado para que obtenhamos seu panic handler.
  • Este exemplo irĂĄ compilar, mas nĂŁo executarĂĄ, pois nĂŁo possui um ponto de entrada.