是否可以将 Box 与 no_std 一起使用?

And*_*raw 9 rust

我想Box在板条箱中使用no_std。这可能吗?到目前为止我的简单尝试还没有奏效。

编译(但使用标准库):

fn main() {
    let _: Box<[u8]> = Box::new([0; 10]);
}
Run Code Online (Sandbox Code Playgroud)

这不会:

#![no_std]

fn main() {
    let _: Box<[u8]> = Box::new([0; 10]);
}
Run Code Online (Sandbox Code Playgroud)

游乐场

然而,查看 Rust 源代码,我发现Boxliballoc 中定义了警告

该库与 libcore 一样,不适合一般用途,而是作为其他库的构建块。该库中的类型和接口通过标准库重新导出,不应通过该库使用。

由于Box不依赖于 std 而只是重新导出它,看来我只需要找出将其导入到我的代码中的正确方法。(尽管这似乎不推荐。)

mal*_*rbo 10

您必须导入箱子alloc

#![no_std]

extern crate alloc;

use alloc::boxed::Box;

fn main() {
    let _: Box<[u8]> = Box::new([0; 10]);
}
Run Code Online (Sandbox Code Playgroud)

alloc板条箱是由编译器提供的(就像std在非no_std环境中一样),因此您不需要从 crates.io 中提取它或在Cargo.toml. 从 Rust 1.36 开始,板条箱就稳定了(稳定 PR)。

请注意,这会编译为 lib,但由于缺少lang_items. 不幸的是,编译no_std二进制文件仍然需要 Rust nightly。

  • 稍微想一下,似乎 Box&lt;&gt; 不应该出现在基本语言定义中,因为它假设一个堆。但堆可能并非在所有平台上都可用。 (2认同)