#string #cow #str #small

no-std mstr

MStr 是一个双字长、不可变的 Cow<str>

4 个版本

0.1.4 2023年11月24日
0.1.3 2023年11月23日
0.1.2 2023年11月23日
0.1.1 2023年11月23日
0.1.0 2023年11月23日

Rust 模式 中排名第 756

每月下载 31

MIT/Apache

31KB
491

MStr

Latest Version Crates.io Downloads GitHub Stars

GitHub Crates.io Docs.rs

MStrCow<str> 的不可变版本。

Cow<str> 占用 4 个字长,并非所有应用程序都需要可变性。因此,诞生了 MStr。它的名字缩写为 "maybe string"(可能字符串),因为它可能是借用或拥有的(我知道这很愚蠢)。

您可以将它视为一个枚举,它存储的是一个 &'a str 或一个 Box<str>。然而,这样的枚举将占用 3 个字长(指针/usize 的大小),因为单个位区分符必须占用整个字的空间,这是由于对齐的要求。

但我们还可以更小。如果我们能找到一个地方将区分符位(表示我们是否是借用的或拥有的)折叠到其他字段(指针和长度)中,我们可以将此类型的大小再减少一个字。

有 3 个潜在的位置可以放置它

指针的最高位
某些架构为指针标记保留了最高位(例如,ARM 实际上保留了 最高 8 位)。然而,并非所有架构都这样做,这将显著降低该库的可移植性(我不想编写任何特定平台的代码),因此这不可行。

指针的最低位
这没有高位标记的可移植性问题,但需要指针是 适当对齐的(因为如果地址是 16 的倍数,则最低 4 位必须始终为零,因为 Math™)。不幸的是,Rust 中的字符串是 1 字节对齐的,所以这不会工作。

长度的最高位
这是最后的可行选项,所以它必须能行(剧透:它可以)。
Rust将所有分配限制在最大isize::MAX字节,这意味着最高位始终为零,因此我们可以用它来标记。太好了!

因此,这个crate将判别位折叠到长度字段的最高位,其中1表示所有者,而0表示借用。然而,这对这个crate的用户来说完全是透明的,所以你不必担心。

享受更小的字符串操作吧!

特性

此crate有1个特性(默认关闭)

  • serde:为MStr实现SerializeDeserialize。反序列化始终返回一个所有者的MStr(与Cow的行为相同)。

不使用Std

此crate不需要标准库(标记为#![no_std]),但它需要alloc(显然)。

贡献

欢迎在GitHub上做出贡献!请随意为任何内容打开一个PR或问题!

许可协议

本项目许可协议为MIT许可证或Apache 2.0许可证,由您选择。

依赖关系

~175KB