在 no_std 环境中我该如何替换 Vec 和 HashSet?

mot*_*son 6 rust webassembly rust-no-std

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

如何删除/替换这些功能而不丢失像 webassemble 这样的 no_std 环境中的功能。我想我可以选择 &str 而不是 String,但是其他的呢?

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

bk2*_*204 12

正如评论中所提到的,您不需要将自己限制在no_stdWASM 中,因为许多标准库都是可用的,包括这两个集合。

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

您不能在环境中使用HashMap或,因为为了避免哈希冲突攻击,它们需要访问安全的随机数据源。即使环境也可能处理不受信任的数据,因此保持这种安全不变性很重要。在那里,您可以使用和来代替(也来自),它们提供类似的功能,但性能特征略有不同,对相关数据的要求也略有不同。由于这些集合是确定性的,因此无需内存分配器即可实现它们。HashSetno_stdno_stdBTreeMapBTreeSetalloc


rea*_*n93 5

使用哈希棕板条箱。它\xe2\x80\x99s是Rust标准库\xe2\x80\x99s HashMap的独立导出,但正如之前提到的,它确实依赖于全局分配器的存在来运行。

\n