Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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