4个版本 (1个稳定版)
使用旧版Rust 2015
| 1.3.1 | 2021年2月19日 |
|---|---|
| 1.3.0 |
|
| 1.2.0 |
|
| 1.1.0 |
|
| 0.1.1 |
|
在内存管理中排名第205
每月下载量29次
265KB
3.5K SLoC
scratchpad
一个Rust库,提供支持两端分配的栈式内存分配器。
注意:scratchpad目前处于维护模式。我已经考虑了一段时间进行重大清理,以去除多余的功能并减少unsafe代码的暴露面积,但目前还没有时间表。我仍将根据需要应用修复,但其他方面的发展已经停滞。
Scratchpad提供了一种快速、安全地动态分配任意类型的方法,而不依赖于全局堆(例如使用Box或Vec)。分配是从一个固定大小的内存区域以栈式方式进行的,使用两个独立的栈(一个用于分配缓冲区的两端)来允许从两端进行不同类型且具有独立生命周期的分配。
此类分配器通常用于游戏开发,但也适用于短生命周期的分配或具有共同生命周期的分配组。虽然不如堆分配灵活,但来自栈分配器的分配通常要快得多,并且与堆的其他部分隔离,从而减少内存碎片。
功能包括
- 用户定义的数据后端存储(静态数组、boxed切片或可变切片引用)。
- 从任何scratchpad实例分配任何数据类型。
- 能够组合内存中相邻的分配或添加到最近创建的分配。
- 支持两端分配(从“前端”分配与“后端”分配分开,但共享相同的内存池)。
- 使用生命周期来防止对分配数据的悬垂引用。
- 运行时开销低。
- 支持
no_std使用。
使用方法
将此内容添加到您的Cargo.toml
[dependencies]
scratchpad = "1.3"
对于Rust 2015代码,还需要在crate根目录中添加以下内容
#[macro_use]
extern crate scratchpad;
Rust版本支持
最低支持的Rust版本是1.25,因为使用了NonNull<T>和repr(align)属性。
no_std支持
scratchpad不需要Rust标准库,尽管它默认使用(通过std crate功能)以提供对在各个地方使用Box和Vec的支持。对于no_std支持,必须在您的Cargo.toml中禁用std功能。
[dependencies]
scratchpad = { version = "1.3", default-features = false }
通过启用alloc功能,即使在no_std构建中也仍然可以提供Box和Vec的支持,该功能直接使用alloc crate
[dependencies]
scratchpad = { version = "1.3", default-features = false, features = ["alloc"] }
alloc功能需要Rust 1.36.0或更高版本。较老的nightly工具链版本仍然可以通过启用unstable功能在no_std代码中使用Box和Vec
不稳定功能
unstable crate功能在夜间工具链中使用时提供一些额外功能
- 将函数
Scratchpad::new()声明为const。 - 对在旧版Rust发布中仍然不稳定的功能的支持
Box和Vec对no_std代码的支持(当使用Rust 1.36.0或更高版本并启用alloc功能时,无需启用unstable功能)。ByteDatatrait对u128和i128的实现(当使用Rust 1.26.0或更高版本时,无需启用unstable功能)。ByteDatatrait对所有包装其他ByteData类型的std::mem::MaybeUninit类型的实现(当使用Rust 1.36.0或更高版本时,无需启用unstable功能)。
只需将unstable功能添加到您的Cargo.toml依赖中即可
[dependencies]
scratchpad = { version = "1.3", features = ["unstable"] }
许可
根据您的选择,许可协议为以下之一
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
。
贡献
除非您明确声明,否则您提交给工作以供包含的任何贡献,根据Apache-2.0许可定义,将按上述方式双许可,没有额外的条款或条件。