alloc
Чтобы использовать alloc, нужно реализовать глобальный (кучевой) аллокатор.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
#![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();
const HEAP_SIZE: usize = 65536;
static mut HEAP: [u8; HEAP_SIZE] = [0; HEAP_SIZE];
pub fn entry() {
// SAFETY: `HEAP` используется только здесь, а `entry` вызывается только один раз.
unsafe {
// Дайте аллокатору немного памяти для выделения.
HEAP_ALLOCATOR.lock().init(&raw mut HEAP as usize, HEAP_SIZE);
}
// Теперь мы можем делать то, что требует выделения памяти в куче.
let mut v = Vec::new();
v.push("A string".to_string());
}
buddy_system_allocator— крейт, реализующий простой аллокатор «системы двойников» (buddy system). Доступны и другие крейты, или вы можете написать свой аллокатор или подключиться к существующему.- Константный параметр
LockedHeap— максимальный порядок аллокатора; то есть в данном случае он может выделять области размером до 2**32 байт. - Если какой-либо крейт в дереве зависимостей зависит от
alloc, в вашем бинарном файле должен быть ровно один глобальный аллокатор. Обычно это делается в самом верхнем бинарном крейте. extern crate panic_halt as _необходим, чтобы крейтpanic_haltбыл слинкован и мы получили его обработчик паники.- Этот пример соберётся, но не запустится, потому что у него нет точки входа.