4个版本 (1个稳定版)

使用旧版Rust 2015

1.3.1 2021年2月19日
1.3.0 2019年7月22日
1.2.0 2018年7月7日
1.1.0 2018年6月16日
0.1.1 2018年4月29日

内存管理中排名第205

每月下载量29

MIT/Apache

265KB
3.5K SLoC

scratchpad

一个Rust库,提供支持两端分配的栈式内存分配器。

Latest Version Released API docs MIT/Apache-2.0 licensed Rustc Version 1.25+ Build Status

注意:scratchpad目前处于维护模式。我已经考虑了一段时间进行重大清理,以去除多余的功能并减少unsafe代码的暴露面积,但目前还没有时间表。我仍将根据需要应用修复,但其他方面的发展已经停滞。

Scratchpad提供了一种快速、安全地动态分配任意类型的方法,而不依赖于全局堆(例如使用BoxVec)。分配是从一个固定大小的内存区域以栈式方式进行的,使用两个独立的栈(一个用于分配缓冲区的两端)来允许从两端进行不同类型且具有独立生命周期的分配。

此类分配器通常用于游戏开发,但也适用于短生命周期的分配或具有共同生命周期的分配组。虽然不如堆分配灵活,但来自栈分配器的分配通常要快得多,并且与堆的其他部分隔离,从而减少内存碎片。

功能包括

  • 用户定义的数据后端存储(静态数组、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功能)以提供对在各个地方使用BoxVec的支持。对于no_std支持,必须在您的Cargo.toml中禁用std功能。

[dependencies]
scratchpad = { version = "1.3", default-features = false }

通过启用alloc功能,即使在no_std构建中也仍然可以提供BoxVec的支持,该功能直接使用alloc crate

[dependencies]
scratchpad = { version = "1.3", default-features = false, features = ["alloc"] }

alloc功能需要Rust 1.36.0或更高版本。较老的nightly工具链版本仍然可以通过启用unstable功能在no_std代码中使用BoxVec

不稳定功能

unstable crate功能在夜间工具链中使用时提供一些额外功能

  • 将函数Scratchpad::new()声明为const
  • 对在旧版Rust发布中仍然不稳定的功能的支持
    • BoxVecno_std代码的支持(当使用Rust 1.36.0或更高版本并启用alloc功能时,无需启用unstable功能)。
    • ByteData trait对u128i128的实现(当使用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-2.0许可定义,将按上述方式双许可,没有额外的条款或条件。

依赖项