#stack-memory #heap-allocation #memory #inline #stack #string #vector

nightly inlined

用于内联小型集合以避免不必要的堆分配的类型

1 个不稳定版本

0.1.1 2024年3月27日
0.1.0 2024年3月26日

#658 in 内存管理


portal-tunneler 中使用

MIT/Apache

81KB
2K SLoC

用于内联小型集合以避免不必要的堆分配的类型。

通常需要使用向量存储几个小元素,并最终使用 [Vec]。此类型在堆上分配内存,如果你只使用几个元素,那么使用栈或在内联结构中内联向量会更有效率。

例如,域名通常小于100个字符,且不能超过255个字符。与其使用在创建和克隆时都在堆上分配内存的 String,你可以使用一个 TinyString::<255>,这是一个256字节的架构,可以存储最多255个字节,并使用内联内存,克隆就像复制内存一样简单

use inlined::TinyString;
use std::fmt::Write;

let mut s = TinyString::<32>::new(); // 32 is the maximum length of the string

s.push_str("Hello!");
assert_eq!(s.as_str(), "Hello!");

let _ = write!(s, " Your number is {}.", 1234);
assert_eq!(s.as_str(), "Hello! Your number is 1234.")

提供类型

此crate包含以下类型

  • InlineVecInlineString 类型类似于标准库中的 [Vec] 和 String,但它们是内联的,并且具有固定的、有限的容量。
  • TinyVecTinyString 类型工作方式类似,但使用 u8 而不是 usize 作为长度。这使得它们更适合传递或在其他结构中内联。
  • CompactVec》是一种类型,它将 [Vec] 和 TinyVec 结合在一起,表示一个可以内联存储最多 N 个元素的向量,但如果需要更多容量,则会溢出到堆上并分配内存。

由于这些类型都实现了 Deref,对于 &[T]&str,因此它们包含了许多您习惯于从 [Vec] 和 String 中拥有的方法。

指定容量

所有这些类型都使用 const generics 来指定它们的内联容量。这意味着您可以选择希望您的内联类型存储的最大元素数量。无论您是想存储仅仅 3、100,甚至是数千个元素,这些类型都能满足您的需求。

无运行时依赖