2个版本
0.5.1 | 2019年7月2日 |
---|---|
0.5.0 | 2019年6月17日 |
0.4.3 |
|
0.4.2 |
|
0.1.6 |
|
#400 在 内存管理
每月下载量 27次
78KB
1.5K SLoC
heaparray
此crate旨在通过提供一种自定义分配内存块的方式(可选包含关于块本身的元数据),来让人们更好地控制内存分配,从而更轻松地实现动态大小类型(DST),并减少在线程之间共享数据所需的指针间接引用的数量。
功能
- 动态大小类型的安全API
- 通用实现常见任务,这样您可以自定义类型的实现,而无需编写额外的样板代码
- 原子引用计数的任意大小内存块,不使用
Vec
;这意味着您只需通过单个指针间接引用即可访问引用计数的内存。
示例
创建一个数组
use heaparray::*;
let len = 10;
let array = HeapArray::new(len, |idx| idx + 3);
assert!(array[1] == 4);
索引工作如预期
use heaparray::*;
let mut array = HeapArray::new(10, |_| 0);
array[3] = 2;
assert!(array[3] == 2);
此外,您可以使用HeapArray::with_label
函数自定义与数组元素一起存储的信息
struct MyLabel {
pub even: usize,
pub odd: usize,
}
let array = HeapArray::with_label(
MyLabel { even: 0, odd: 0 },
100,
|label, index| {
if index % 2 == 0 {
label.even += 1;
index
} else {
label.odd += 1;
index
}
});
动态大小类型
Rust文档中关于异构大小类型的部分结尾指出
目前创建自定义DST的唯一正确支持方式是通过使您的类型泛型并执行非大小转换...(是的,自定义DST目前是一个基本未完成的功能。)
此crate旨在提供其中一些功能;文档中给出的代码如下
struct MySuperSliceable<T: ?Sized> {
info: u32,
data: T
}
fn main() {
let sized: MySuperSliceable<[u8; 8]> = MySuperSliceable {
info: 17,
data: [0; 8],
};
let dynamic: &MySuperSliceable<[u8]> = &sized;
// prints: "17 [0, 0, 0, 0, 0, 0, 0, 0]"
println!("{} {:?}", dynamic.info, &dynamic.data);
}
使用此crate,MySuperSliceable<[u8]>
类型将这样实现
use heaparray::*;
type MySuperSliceable = HeapArray<u8, u32>;
fn main() {
let info = 17;
let len = 8;
let dynamic = MySuperSliceable::with_label(info, len, |_,_| 0);
println!("{:?}", dynamic);
}
许可证:MIT