#array #container #heap #zero #fixed-sized

nightly arr

基于堆的固定大小数组

9个版本 (5个破坏性更改)

0.6.1 2020年9月11日
0.6.0 2020年4月29日
0.5.0 2020年4月17日
0.4.1 2020年4月17日
0.1.0 2020年4月11日

⚠️ 已报告问题

325模板引擎

每月32 次下载

MIT 许可证

12KB
250

arr软件包提供了一种纯堆基础的单一固定大小数组数据结构。

Crates.io

文档

包含

[dependencies]
arr = "0.6.0"

基本用法

use arr::Array;

// Allocate a 16MB chunk of zeros as 16 byte sub-arrays
let huge_array: Array<[u8; 16]> = Array::zero(1 << 20);
println!("{}", huge_array.len());

这个软件包的动机来自Rust在不过量使用栈的情况下难以分配堆基础数组的限制。

这可能会使栈溢出

let huge_array: [[u8; 16]; 1 << 20] = [[0u8; 16]; 1 << 20];

lib.rs:

arr软件包是一个简单的固定大小数组,旨在允许不发生栈溢出地分配大型数组。

即使在rustc 1.44中,如果数组太大而不能适合栈(例如,大小为8MB),即使数组是Boxed的,也会发生栈溢出。

基本用法

use arr::Array;
// zero - fast allocation
let big_array: Array<u8> = Array::zero(1 << 25);
// default - slow allocation
let big_array2: Array<u8> = Array::new(1 << 25);
// template
let template = 10u8;
let big_array3: Array<u8> = Array::new_from_template(1 << 25, &template);

// Also works for 2d arrays (note even the sub-array would ordinarily blow stack)
let big_2d_array: Array<[u8; 1 << 25]> = Array::zero(4);

尝试使用传统的数组做这件事

let big_array: Box<[u8; 1 << 25]> = Box::new([0u8; 1 << 25]);

目前数组支持三种分配模式,通过new(需要类型具有Default + Copy)和new_from_template,只需Clone。构造函数zero使用内部Zeroable trait,仅针对原始类型及其数组设置。将来这个概念可能不安全地扩展到这个软件包之外,但现在它是私有的。只要这种类型适合栈并且数组适合内存,这应该可以被分配。

无运行时依赖