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
功能)。ByteData
trait对u128
和i128
的实现(当使用Rust 1.26.0或更高版本时,无需启用unstable
功能)。ByteData
trait对所有包装其他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 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则您提交给工作以供包含的任何贡献,根据Apache-2.0许可定义,将按上述方式双许可,没有额外的条款或条件。