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() {
    // SEGURANÇA: `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.