#fixed-size #heap #capacity #array #length #pointers

fixed-capacity-vec

基于固定大小堆数组的可变长度缓冲区

4 个版本 (2 个稳定版本)

1.0.1 2023年9月14日
1.0.0 2023年9月13日
0.1.0 2023年9月1日
0.0.1 2023年8月30日

#200数据结构

Download history 631/week @ 2024-03-30 555/week @ 2024-04-06 433/week @ 2024-04-13 649/week @ 2024-04-20 835/week @ 2024-04-27 715/week @ 2024-05-04 1101/week @ 2024-05-11 568/week @ 2024-05-18 371/week @ 2024-05-25 776/week @ 2024-06-01 514/week @ 2024-06-08 501/week @ 2024-06-15 880/week @ 2024-06-22 159/week @ 2024-06-29 964/week @ 2024-07-06 791/week @ 2024-07-13

每月2,866次下载
用于 8 个crate(通过 hashx

MIT/Apache

25KB
420

FixedCapacityVec - 类似于 Vec 但在编译时固定容量

FixedCapacityVec 是一种简单的专用数据结构。一个用例是希望逐步构建一个非平凡固定大小表的程序。

std 类型之间的关系

以下所有类型仅在堆上存储实际的缓冲区,并且它们可以在不复制数据的情况下进行相互转换。

类型 大小和表示(例如在栈上) 完整? 可变性
Vec 3个单词:指针、长度、容量 也许 无限可追加
Box<[T]> 2个单词:指针、长度 = 容量 总是 在运行时固定长度
FixedCapacityVec<T, N> 2个单词:指针、长度 也许 可追加,但容量在编译时固定
Box<[T; N]> 1个单词:指针 总是 长度在编译时固定
         Vec<T>              HEAP                     Box<[T]>          HEAP 
             +----------+     +------------+            +----------+     +----------+
             | pointer -----> | T          |            | pointer -----> | T        |
             | length   |     | T ...      |            | length   |     | T ...    |
             | capacity |     +--length----+            +----------+     +--length--+
             +----------+     | (spare)    |
                              +--capacity--+

   FixedCapacityVec<T, N>    HEAP                     Box<[T; N]>        HEAP
             +----------+     +-------------+            +----------+     +---------+
             | pointer -----> | T           |            | pointer -----> | T       |
             | length   |     | T ...       |            +----------+     | T ...   |
             +----------+     |--length-----|                             +--N------+
                              | (spare)     |
                              +--N----------|

与其他crate的vec-like类型之间的关系

FixedCapacityVec 的用途与 ArrayVecSmallVec 不同。

FixedCapacityVec 的数据始终位于堆上。

Vec 相比,FixedCapacityVec 的优点是它本身的大小很小,容量不需要表示或查找。它可以非常便宜地转换为boxed数组,或者转换为boxed切片或切片,而不需要复制。

ArrayVec 也是一个具有固定容量的类似 vec 的结构。但是 ArrayVec 的数据紧邻元数据。因此,要将完整的 ArrayVec 转换为封装数组,数据必须被复制。即使它是完整的 Box<ArrayVec<..>>,至少,它的分配空间需要缩小。其中 ArrayVec 的一个使用案例是它能够增量构建(通常是短)数组而无需堆分配。

SmallVec 的好处是可以将少量数据存储在栈上,而不是说 SmallVec 本身特别小;事实上,ArrayVecSmallVec 都足够存储 NT

   ArrayVec<T, N>      	   SmallVec<[T; N]>          SmallVec<[T; N]>
     +-----------+           +--------------+        +---------------+    HEAP
     | T         |           | length <= N  |        | capacity > N  |     +------------+
     | T ...     |           +--0-----------+        | pointer ----------> | T          |
     +--length---+           | T            |  OR    | length        |     | T ...      |
     | (uninit)  |           | T ...        |        +---------------+     +--length----+
     +--N--------+           |--length------|        | (unused)      |     | (uninit)   |
     | length    |           | (spare)      |        |               |     +--capacity--+
     +-----------+           +--N-----------+        +---------------+

没有运行时依赖

特性