#string #cow #sso #vector #memory-layout

no-std ecow

紧凑的、写时复制的向量和字符串

6 个版本

0.2.2 2024年3月23日
0.2.1 2024年3月6日
0.2.0 2023年10月9日
0.1.2 2023年8月19日
0.1.0 2023年3月1日

#78数据结构

Download history 2194/week @ 2024-04-28 1434/week @ 2024-05-05 1982/week @ 2024-05-12 2619/week @ 2024-05-19 2215/week @ 2024-05-26 2202/week @ 2024-06-02 2072/week @ 2024-06-09 2307/week @ 2024-06-16 2009/week @ 2024-06-23 2403/week @ 2024-06-30 2464/week @ 2024-07-07 2414/week @ 2024-07-14 2576/week @ 2024-07-21 2387/week @ 2024-07-28 2449/week @ 2024-08-04 2401/week @ 2024-08-11

10,102 每月下载量
58 个crate(19 个直接) 中使用

MIT/Apache

73KB
1.5K SLoC

ecow

Crates.io Documentation

紧凑的、写时复制的向量和字符串。

类型

  • EcoVec 是一个引用计数写时复制的向量。它占用两个字的空间(= 2 usize)并且与 &[T] 切片具有相同的内存布局。在其分配中,它存储引用计数、容量和其元素。

  • EcoString 是一个具有内联存储的引用计数写时复制字符串。它占用16字节的空间。它有15个字节的内联存储,从16个字节开始变为 EcoVec<u8>

示例

// This is stored inline.
let small = ecow::EcoString::from("Welcome");

// This spills to the heap, but only once: `big` and `third` share the
// same underlying allocation. Vectors and spilled strings are only
// really cloned upon mutation.
let big = small + " to earth! 🌱";
let mut third = big.clone();

// This allocates again to mutate `third` without affecting `big`.
assert_eq!(third.pop(), Some('🌱'));
assert_eq!(third, "Welcome to earth! ");

为什么我应该用这个而不是 ...

类型 详细信息
Vec<T> / String 普通的向量是一个非常好的通用数据结构。但是,它们有相当大的内存占用(3个机器字)并且复制成本很高。《code>EcoVec 在变更是有一些开销,但是复制成本低,并且只需要两个字。
Arc<Vec<T>> / Arc<String> 这些需要两个分配而不是一个,并且修改起来不太方便。
Arc<[T]> / Arc<str> 虽然这些只需要一次分配,但它们不可变。
小向量 有不同的权衡。当存在少量小 T 时效果很好,但溢出到堆上时克隆成本较高。
小字符串 EcoString 将不同的小字符串特性结合到一个非常实用的包中:它具有内联存储,比正常 String 的占位空间更小,即使在溢出时也能高效地克隆,并且同时可变。

许可

此软件包同时受 MIT 和 Apache 2.0 许可的双重许可。

依赖项

~0–24MB
~335K SLoC