Rust 的标准库公开为三个包:
std
、alloc
和 core
。就 API 而言,core
中的功能是 std
的子集,无需依赖任何操作系统集成或堆分配即可支持。 alloc
介于两者之间,其功能依赖于堆分配,但不与其他操作系统集成。在为我的库编写导入时,我总是想通过更兼容的 core
或 alloc
而不是 std
来引用模块(如果可用)。
但是,我不清楚他们对相同功能的实现是否会有所不同。如果我使用
core::cell::RefCell
,我是否可以获得比我引用 std::cell::RefCell
效率更低的实现?
通过
core
或 alloc
而不是 std
引用模块(如果可用)有什么缺点吗?
Rust 的目标是成为一种通用语言,可以在多种架构(x86_64、i686、PowerPC、ARM、RISC-V)和系统(Windows、macOS、Linux)甚至没有 O运行的嵌入式系统上运行S系统.
但是,当您没有操作系统时,您不一定有内存分配器或文件处理,因为这些是操作系统通常会做的事情。
这就是
#![no_std]
发挥作用的地方。如果您将该指令放入 lib.rs 中,您将告诉 Rust 编译器不要链接 std
箱,而仅使用 core
代替。正如您所说,core
是std
的子集,并且(大部分)拥有不需要分配内存或其他需要底层操作系统的东西。
但实际实施中没有区别。如果
core
中提供了该函数,则 std
中的函数只是一个 reexport。
TL;DR:如果您正在运行操作系统,请使用
std
,否则使用 core
。无需混合它们。