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 在 数据结构
10,102 每月下载量
在 58 个crate(19 个直接) 中使用
73KB
1.5K SLoC
ecow
紧凑的、写时复制的向量和字符串。
类型
-
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