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 і ми отримаємо його обробник паніки.
  • Цей приклад збиратиметься, але не запускатиметься, оскільки він не має точки входу.