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 ハンドラを利用できるようにするために必要です。- この例はエントリポイントを持たないため、ビルドはできますが実行はできません。