8 个版本 (稳定)

2.1.0 2024 年 4 月 26 日
2.0.0 2023 年 11 月 2 日
1.3.0 2023 年 11 月 2 日
1.2.0 2023 年 7 月 3 日
0.0.0 2022 年 8 月 21 日

#120 in Rust 模式

Download history 4344/week @ 2024-04-27 3332/week @ 2024-05-04 3514/week @ 2024-05-11 4488/week @ 2024-05-18 4100/week @ 2024-05-25 4235/week @ 2024-06-01 3856/week @ 2024-06-08 3581/week @ 2024-06-15 4175/week @ 2024-06-22 3776/week @ 2024-06-29 4448/week @ 2024-07-06 6883/week @ 2024-07-13 5703/week @ 2024-07-20 5679/week @ 2024-07-27 6181/week @ 2024-08-03 6522/week @ 2024-08-10

每月 25,064 次下载
用于 31 个 crate (23 个直接使用)

MIT/Apache

13KB
115

static-cell

crates.io crates.io Documentation

静态分配,运行时初始化的 cell。

StaticCell 提供了一种在编译时为值预留内存、但在运行时初始化它并获取其 'static 引用的方式,无需使用标准库和分配。

以下场景下很有用:

  • 你需要 &'static T,但 T 不能在 const 上下文中构造,因此你不能简单地使用 static
  • 你需要 &'static mut T,而不仅仅是 &'static T

示例

use static_cell::StaticCell;

// Statically allocate memory for a `u32`.
static SOME_INT: StaticCell<u32> = StaticCell::new();

// Initialize it at runtime. This returns a `&'static mut`.
let x: &'static mut u32 = SOME_INT.init(42);
assert_eq!(*x, 42);

// Trying to call `.init()` again would panic, because the StaticCell is already initialized.
// SOME_INT.init(42);

替代方案

  • 如果你可以使用 alloc,你可以使用 Box::leak()
  • 如果你接受 unsafe,你可以使用 static mut THING: MaybeUninit<T>
  • 如果你只需要 &'static T(而不是 &'static mut T),那么有 OnceCell(不是线程安全的)或 OnceLock(线程安全,但需要 std)。

互操作性

此软件包使用 portable-atomic,因此在没有本地原子操作的目标上,您必须导入一个提供 critical-section 实现的软件包。有关详细信息,请参阅 critical-section 的 README 文件。

最低支持的 Rust 版本 (MSRV)

此软件包保证在稳定版 Rust 1.56 及以上版本上编译。它可能可以用旧版本编译,但在任何新补丁版本中可能会改变。

许可证

此作品根据您的选择受以下任一许可证的许可:

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交以包含在此作品中的任何贡献,应按上述方式双重许可,不得添加任何额外的条款或条件。

依赖项

~1MB
~15K SLoC