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

标签 rust webassembly rust-no-std

我正在研究一个要编译为Webassembly的项目。所以我想我必须将库标记为no_std。但是由于它当前非常依赖Vec,String和HashSet,所以当我遇到这些功能的错误时,这似乎是不可能的。
如何删除/替换这些功能,而又不会在no_std环境(如webassembly)中失去功能。我想我可以选择&str而不是String,但是其他的呢?
如果我删除#![cfg_attr(not(test), no_std)]并编译该项目,则它似乎可以作为Webassembly二进制文件工作。如果添加行时出现错误,为什么会这样呢?

最佳答案

正如评论中提到的那样,您不需要将自己局限于WASM中的no_std,因为有很多标准库可用,包括这两个集合。
但是,如果您在真实的no_std环境中进行构建,则可以使用Vec,前提是您使用alloc crate ,该 crate 可用于分配内存。 String同样可用。在大多数情况下,您将有一些可用的内存分配,因此alloc是一个选项。
您不能在HashMap环境中使用HashSetno_std,因为要避免散列冲突攻击,它们需要有权访问安全的随机数据源。甚至no_std环境也可能处理不受信任的数据,因此保留此安全性不变很重要。在这里,您可以改用BTreeMapBTreeSet(也来自alloc),它们提供相似的功能,但性能特征略有不同,对所讨论的数据的要求也略有不同。由于这些集合是确定性的,因此可以在不超过内存分配器的情况下实现它们。

关于rust - 在no_std环境中,我该如何替换Vec和HashSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65469712/

相关文章:

rust - 从 fmt::Argus 获取数据而不进行堆分配

json - serde_json::from_str 错误,其中字符串来自文件

rust - 我如何在线程和函数之间设置 "share"套接字?

javascript - 我可以使用 emscripten 在 i386 模式下编译应用程序吗?

javascript - 获取 WebAssembly 导出函数的地址?

debugging - 使用 clang 编译到 wasm 时如何保留变量名称

string - 运行时构建 : String not found in this scope

rust - 为什么 no_std crate 可以依赖于使用 std 的 crate?

rust - 是否有无堆的 trait 对象?

rust - Rust 中的多重可变引用预防是如何工作的?