【问题标题】:What do I replace Vec and HashSet with in a no_std environmement?在 no_std 环境中,我应该用什么替换 Vec 和 HashSet?
【发布时间】:2021-04-04 18:12:19
【问题描述】:

我正在开发一个旨在编译为 webassembly 的项目。所以我想我必须将库标记为 no_std。但由于它目前大量依赖 Vec、String 和 HashSet,这似乎是不可能的,因为我在这些功能上遇到了错误。

如何在不丢失 no_std 环境(如 webassembly)中的功能的情况下删除/替换这些功能。我想我可以选择 &str 而不是 String,但是其他的呢?

如果我删除 #![cfg_attr(not(test), no_std)] 并编译项目,它似乎可以作为 webassembly 二进制文件工作。如果我在添加行时出错,这是为什么呢?

【问题讨论】:

  • 编译成webassembly不需要no_std
  • 哦!我认为 wasm 是一个 no_std 环境。我在其他所有关于 wasm 的帖子中都看到了 no_std,所以这就是我这么认为的原因。 rustwasm.github.io/docs/book/reference/… 说:例如A good rule of thumb is that if a crate supports embedded and #![no_std] usage, it probably also supports WebAssembly.
  • wasm32-unknown-unknown 目标确实有可用的std crate,但并非所有部分都已实现。 (你可以在 Rust 源代码中看到这个 here。)例如,如果你尝试在 WebAssembly 中使用 std::fsstd::net,你的代码可能会出现恐慌或返回错误。但是像VecHashMap 这样的东西应该没有问题。
  • 太棒了!那么这就解释了! :) 谢谢!有什么理由尝试在 wasm 中保留 no_std 吗?

标签: rust webassembly rust-no-std


【解决方案1】:

正如 cmets 中提到的,您无需在 WASM 中将自己限制为 no_std,因为大部分标准库都可用,包括这两个集合。

但是,如果您在真实的no_std 环境中构建,则可以使用Vec,前提是您使用了alloc crate,它允许您分配内存。 String 同样可用。在大多数情况下,您会有一些可用的内存分配,因此alloc 是一个选项。

您不能在no_std 环境中使用HashMapHashSet,因为为避免哈希冲突攻击,它们需要访问安全的随机数据源。即使no_std 环境也可能处理不受信任的数据,因此保留此安全不变量很重要。在那里,您可以改用BTreeMapBTreeSet(也来自alloc),它们提供了类似的功能,但性能特征略有不同,对相关数据的要求也略有不同。因为这些集合是确定性的,所以它们可以在没有内存分配器的情况下实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2018-09-30
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2020-12-29
    • 2015-05-19
    相关资源
    最近更新 更多