#pinned #memory #vec #array #vector

orx-pinned-vec

PinnedVec trait定义了向量的接口,保证向量化元素除非明确更改,否则都会固定在其内存位置。

36个版本 (22个稳定版本)

3.5.0 2024年8月22日
3.2.0 2024年7月25日
2.12.0 2024年6月28日
2.6.0 2024年3月24日
0.4.3 2023年9月8日

#925数据结构

Download history 137/week @ 2024-05-03 249/week @ 2024-05-10 93/week @ 2024-05-17 38/week @ 2024-05-24 239/week @ 2024-05-31 44/week @ 2024-06-07 57/week @ 2024-06-14 42/week @ 2024-06-21 252/week @ 2024-06-28 27/week @ 2024-07-05 75/week @ 2024-07-12 393/week @ 2024-07-19 862/week @ 2024-07-26 835/week @ 2024-08-02 404/week @ 2024-08-09 378/week @ 2024-08-16

每月2,636次下载
用于 11 crates

MIT许可

79KB
1.5K SLoC

orx-pinned-vec

orx-pinned-vec crate orx-pinned-vec documentation

PinnedVec trait定义了向量的接口,保证向量化元素除非明确更改,否则都会固定在其内存位置。

A. 元素固定保证

PinnedVec保证了其元素的位置不会隐式改变

具体来说,假设一个固定的向量化当前有n个元素

方法 预期行为
push(new_element) 不改变前n个元素的内存位置
extend_from_slice(slice) 不改变前n个元素的内存位置
insert(a,new_element) 不改变前a个元素的内存位置,其中a <= n;插入元素右侧的元素可能会改变,通常向右移动
pop() 不改变前n-1个元素的内存位置,第n个元素被移除
remove(a) 不改变前a个元素的内存位置,其中a < n;移除元素右侧的元素可能会改变,通常向左移动
truncate(a) 不改变前a个元素的内存位置,其中a < n

PinnedVec trait本身不能提供元素固定的保证;因此,它可以被认为是一个标记trait。

然而,此crate还提供了测试函数以断言这些保证

pub fn test_pinned_vec<P: PinnedVec<usize>>(pinned_vec: P, test_vec_len: usize) {
    // ...
}

此函数对特定实现P进行广泛的测试,如果上述任何保证没有得到满足,则会失败。

请注意,std::vec::Vec在增长期间不提供固定元素保证。您可能会找到一个包装结构体JustVec,它实际上就是标准vec:[源代码](https://github.com/orxfun/orx-pinned-vec/blob/main/src/pinned_vec_tests/test_all.rs)。正如预期的那样,test_pinned_vec方法对这个结构体失败了。

B. 动机

在许多情况下,固定元素都是至关重要的。

  • 它对于启用高效、方便且安全的自引用集合至关重要,使用瘦引用,请参阅SelfRefCol获取详细信息,以及其特殊情况,例如LinkedList
  • 对于并发程序来说非常重要,因为它消除了与元素隐式带到不同内存位置相关的安全问题。这有助于减少和解决并发复杂性,并导致高效的并发数据结构。请参阅ConcurrentIterConcurrentBagConcurrentOrderedBag,这些并发数据结构是建立在固定向量固定元素保证之上的。
  • 它对于允许一个不可变的推送向量至关重要;即ImpVec。当所需的集合是一个事物袋或容器而不是具有集体意义时,这是一个非常有用的操作。在这种情况下,ImpVec允许避免某些借用检查复杂性、堆分配和宽指针,如BoxRc等。

C. 实现

SplitVecFixedVec是两种有效的实现。

许可证

此库根据MIT许可证授权。有关详细信息,请参阅LICENSE。

依赖项