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 次下载
12KB
250 行
arr软件包提供了一种纯堆基础的单一固定大小数组数据结构。
包含
[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,仅针对原始类型及其数组设置。将来这个概念可能不安全地扩展到这个软件包之外,但现在它是私有的。只要这种类型适合栈并且数组适合内存,这应该可以被分配。