2

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

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

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

4

1 回答 1

4

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

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

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

于 2020-12-27T21:55:50.100 回答