alloc

alloc を使用するには、 グローバル(ヒープ)アロケータ を実装する必要があります。

// 著作権 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` is only used here and `entry` is only called once.
    unsafe {
        // Give the allocator some memory to allocate.
        HEAP_ALLOCATOR.lock().init(&raw mut HEAP as usize, HEAP_SIZE);
    }

    // Now we can do things that require heap allocation.
    let mut v = Vec::new();
    v.push("A string".to_string());
}
  • buddy_system_allocator は基本的なバディシステム アロケータを実装するクレートです。ほかのクレートも利用できますし、自分で作成したり、既存のアロケータに組み込んだりすることもできます。
  • LockedHeap の const パラメータはアロケータの最大オーダーです。つまり、 この場合は最大 2**32 バイトの領域を割り当てられます。
  • 依存ツリー内のいずれかのクレートが alloc に依存している場合は、バイナリ内に グローバルアロケータをちょうど 1 つ定義しておく必要があります。通常、これは 最上位のバイナリクレートで行います。
  • extern crate panic_halt as _ は、panic_halt クレートがリンクされてその panic ハンドラを利用できるようにするために必要です。
  • この例はエントリポイントを持たないため、ビルドはできますが実行はできません。