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 模式
每月 25,064 次下载
用于 31 个 crate (23 个直接使用)
13KB
115 行
static-cell
静态分配,运行时初始化的 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 License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交以包含在此作品中的任何贡献,应按上述方式双重许可,不得添加任何额外的条款或条件。
依赖项
~1MB
~15K SLoC