3个不稳定版本
使用旧的Rust 2015
0.2.0 | 2020年2月20日 |
---|---|
0.1.1 | 2018年11月9日 |
0.1.0 | 2018年10月24日 |
#411 in 内存管理
1,346 每月下载量
37KB
355 行
indexed::Pool,一个方便的索引链数据结构分配器。
功能
Vec 类似操作。
支持 push
、reserve
和通过索引的随机访问,与 std::Vec 的方法相似。
提供了一个不安全的 write
方法,类似于 std::ptr::write
,但使用索引而不是指针。
也支持其他类似操作,如 len
、set_len
、capacity
、iter
和 iter_mut
。更多详情请参阅API文档。
请注意,不支持删除操作,例如 pop
和 shrink_to_fit
。
- 使用索引将元素彼此链接。
池中的任何元素都必须实现 indexed::Indexed
,它将索引存储在自身中。用户定义的 null
索引表示空链接。
- 从池中的任何元素获取池的引用。
该功能使得用户可以使用元素的引用而不是使用池+索引的方式来使用。在某些用例中,这非常方便,因为库用户不需要在所有地方存储/传递池的引用。
注意:此功能不安全,是否违反内存安全由调用者自行负责。
- 不会发生重新分配。
一旦元素被定位在池中,它将不会移动。
- 池可以是管理的或非管理的。
管理池拥有其元素并在销毁时丢弃它们,而非管理池则不这么做。
- 支持
no_std
。
性能
-
底层缓冲区不是连续的,而是分段的
Vec
。将概念索引映射到底层缓冲区地址的过程与进行一次整数除法一样轻量。 -
元素应提供存储其索引的空间。存储在 usize 中的索引占用一个额外的指针大小。如果结构体中存在32位填充以满足对齐要求,则存储在 u32 中的索引可能不占用额外空间。
-
从其元素获取池的引用与一次指针算术和解除引用操作一样高效。如果用户不满意这种开销,可以选择经典的池+索引 API 风格。
-
库用户可以选择除了默认的 256 之外的不同块大小,以获得更好的性能。
许可协议
基于 MIT 协议许可。
示例
有关更多信息,请参阅API 文档。