| Crates.io | pi_arr |
| lib.rs | pi_arr |
| version | 0.30.0 |
| created_at | 2023-08-26 11:18:24.735201+00 |
| updated_at | 2025-06-12 04:30:11.613195+00 |
| description | lock-free & auto-expansion array |
| homepage | |
| repository | https://github.com/GaiaWorld/pi_arr.git |
| max_upload_size | |
| id | 955480 |
| size | 55,202 |
本库提供了两种自动扩展的数组实现,针对不同环境优化:
VBArr (基于桶的扩展数组)settle()合并所有数据到主数组VecArr (基于Vec的扩展数组)设计目标:WASM环境专用
核心机制:单个自动扩展的Vec
特点:实现简单,无桶结构
线程安全:非线程安全实现
✅ 零拷贝访问 - 直接指针操作避免内存拷贝
✅ ZST支持 - 完美处理零大小类型
🔧 内存整理 - settle() 整合分桶数据到主数组
🔒 细粒度锁 - 分桶初始化使用轻量级锁
| 类型 | 最大元素数 | 内存占用 |
|---|---|---|
| VecArr | usize::MAX | O(n) |
| VBArr | 2^32 - 32 ≈42.9亿 | O(n) |
| 操作 | VecArr | VBArr |
|---|---|---|
| 随机读取 | 1-3 ns | 5-8 ns |
| 顺序迭代 | 2ns/元素 | 5-15ns/元素 |
| 扩容操作 | O(n) | O(1) |
[dependencies]
pi_arr = "0.30"
with_capacity(capacity: usize) -> Self
创建指定初始容量的数组
capacity(len: usize) -> usize
计算给定元素数量所需的总容量
vec_capacity() -> usize
获取主数组的容量(元素数量)
get(index: usize) -> Option<&T>
安全获取元素引用(边界检查)
get_mut(index: usize) -> Option<&mut T>
获取可变元素引用
set(index: usize, value: T) -> T
设置元素值并返回旧值
insert(index: usize, value: T) -> T
在指定位置插入元素
slice(range: Range<usize>) -> Iter
获取指定范围的迭代器
settle(len: usize, additional: usize)
内存整理(合并数据到主数组)
clear(len: usize, additional: usize)
清理数据并释放内存
alloc(index: usize) -> &mut T
获取或分配元素(自动初始化)
load(index: usize) -> Option<&mut T>
安全加载元素(不自动分配)
load_alloc(index: usize) -> &mut T
加载或分配元素(自动初始化)
Arr<T>: 根据特性选择实现
VecArr<T>VBArr<T>Iter<'a, T>: 对应的迭代器类型arr![]: 快速创建数组
let a = arr![1, 2, 3]; // 创建包含元素的数组
let b = arr![0; 5]; // 创建5个0的数组
use pi_arr::{Arr, arr};
fn main() {
// 创建一个包含元素的数组
let mut a = arr![1, 2, 3];
// 插入元素
a.insert(1, 4);
// 获取元素引用
let x = a.get(1).unwrap();
println!("x: {}", x);
// 设置元素值
a.set(1, 5);
// 获取可变元素引用
let mut y = a.get_mut(1).unwrap();
*y = 6;
println!("y: {}", y);
}
欢迎提交Pull Request或Issue来贡献代码或报告问题。