【问题标题】:Is it possible to use Box with no_std?是否可以将 Box 与 no_std 一起使用?
【发布时间】:2016-06-15 18:43:15
【问题描述】:

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

这会编译(但使用标准库):

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

这不是:

#![no_std]

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

(Playground)

但是,查看 Rust 源代码,我看到 Box 在 liballoc 中定义并带有警告

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

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    你必须导入the alloc crate:

    #![no_std]
    
    extern crate alloc;
    
    use alloc::boxed::Box;
    
    fn main() {
        let _: Box<[u8]> = Box::new([0; 10]);
    }
    

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

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

    【讨论】:

    • 看起来#![feature(alloc)] 将永远保持稳定。有什么方法可以在稳定的no_std 中使用Box
    • 稍微考虑一下,似乎 Box 不应该出现在基本语言定义中,因为它假定了一个堆。但是堆可能并非在所有平台上都可用。
    • 你是对的@AndrewStraw,这就是确切的原因。
    • 现在有一个开放的 RFC 来稳定分配:github.com/rust-lang/rfcs/pull/2480
    • alloc 已在 1.36 中稳定。我更新了答案。
    猜你喜欢
    • 2017-11-02
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    • 2019-03-18
    • 2014-03-15
    • 2021-03-31
    相关资源
    最近更新 更多