7 个版本 (4 个破坏性更新)
0.5.0 | 2022年1月22日 |
---|---|
0.4.0 | 2021年12月31日 |
0.3.0 | 2021年12月28日 |
0.2.1 | 2021年9月5日 |
0.1.1 | 2021年8月28日 |
#1783 in 数据结构
每月下载量:149
在 3 crates 中使用
24KB
632 代码行
local_vec
一个 固定容量 向量,其元素存储在本地。特别是,它们可以在 栈 上分配。
LocalVec
是一个 固定容量 向量,即其 大小 或 长度 随着向量和从向量中弹出元素而增加和减少。但是,其 容量 始终保持不变,必须在 编译时 确定。
LocalVec
的元素存储在 LocalVec
本身的 本地缓冲区 中,而不是在堆上分配的 远程缓冲区 中。
LocalVec
与 Vec
LocalVec
的元素位于本地,即在其内部
use local_vec::LocalVec;
let mut vec = LocalVec::<_, 4>::new();
vec.push(3);
vec.push(7);
vec
中的内容如上所示
即,vec
有一个 本地缓冲区,i32
值 3
和 7
存储在 vec
本身中,而不是在堆上分配的 远程 缓冲区中。
相比之下,Vec
在堆上分配一个 远程 缓冲区,并包含对该缓冲区的指针,而不是缓冲区本身
let mut v = Vec::with_capacity(4);
v.extend([3, 7]);
即,v
指向一个 远程缓冲区,i32
值 3
和 7
存储在那个远程缓冲区上,该缓冲区是在堆上分配的。
编译时容量
由于 LocalValue
的大小取决于其容量,因此必须在使用 LocalVec
时在编译时确定其容量。这通过使用 const generics 的常量泛型参数来实现
let mut vec = LocalVec::<i32, 4>::new();
|
const generic argument <--|
在栈或堆上分配
从技术角度讲,元素LocalVec
存储在LocalVec
中是本地的。这些元素是否在栈上,取决于LocalVec
本身是否在栈上分配。例如
let vec = Box::new(LocalVec::<u8, 32>::new());
vec
是在堆上分配的,它包含的元素也是如此,因为它们存储在vec
内部。不过,与Vec
相比,这里没有额外的堆分配。