5 个版本
0.2.2 | 2021 年 7 月 11 日 |
---|---|
0.2.1 | 2021 年 7 月 5 日 |
0.2.0 | 2021 年 7 月 4 日 |
0.1.1 | 2021 年 7 月 1 日 |
0.1.0 | 2021 年 6 月 27 日 |
#340 在 内存管理
每月 23 次下载
56KB
1.5K SLoC
dairy
更紧凑、用户友好的写时复制智能指针。
use dairy::Cow;
let borrowed: Cow<str> = Cow::borrowed("Hello World!");
let owned: Cow<str> = Cow::owned(String::from("Hello World!"));
🚀 入门指南
将以下内容添加到您的 Cargo 清单中。
[dependencies]
dairy = "0.2"
no_std
也支持通过禁用默认的 std
功能。需要分配器。
[dependencies]
dairy = { version = "0.2", default-features = false }
Serde 支持在 serde
功能之后。
[dependencies]
dairy = { version = "0.2", features = ["serde"] }
🤔 描述
dairy::Cow
是标准库中 std::borrow::Cow
的改进版本。根据平台和类型,这个 crate 提供了一个更好的底层实现,这将更加紧凑。这个 crate 目前支持以下类型: str
、[T]
、CStr
、OsStr
和 Path
。
dairy::Cow
还能提供更多 From
实现;其中一些由于 alloc
和 std
的分离,标准库无法提供。例如,现在 Cow<Path>
有一个有用的 From<&str>
实现。
底层实现
- 在 64 位平台上,
Cow
的紧凑实现为两个字宽,将长度、容量和所有者标记存储在同一词中。 - 在32位平台上,紧凑型的
Cow
实现为三个字宽,将容量和所有者标记存储在同一个字中。 - 默认实现简单地使用标准库实现,为四个字宽。这通常在标准库没有为类型的所有权版本提供
.into_raw_parts()
或等效方法时使用。
以下表格记录了根据平台,如何为每种类型的Cow<T>
实现。
Cow<T> |
Unix/WASI | 其他 |
---|---|---|
Cow<str> |
紧凑型 | 紧凑型 |
Cow<[T]> |
紧凑型 | 紧凑型 |
Cow<CStr> |
紧凑型 | 紧凑型 |
Cow<OsStr> |
紧凑型 | 默认 |
Cow<Path> |
紧凑型 | 默认 |
致谢
一些实现细节来自优秀的beef crate。
许可证
在以下许可证中选择一项。
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖关系
~170KB