9 个不稳定版本 (4 个破坏性更新)
0.5.1 | 2024 年 8 月 2 日 |
---|---|
0.5.0 | 2024 年 6 月 25 日 |
0.4.0 | 2023 年 12 月 1 日 |
0.3.3 | 2023 年 10 月 30 日 |
0.1.0 | 2023 年 6 月 1 日 |
#54 在 内存管理
每月 114 次下载
400KB
9K SLoC
hipstr
另一个 Rust 字符串类型 🦀
- 通过
borrowed
(一个const
构造函数) 或from_static
进行无拷贝 借用 - 无拷贝 小字符串 (64 位平台上的 23 字节)
- 无拷贝 拥有切片
- 一个利基:`Option<HipStr>` 和 `HipStr` 具有相同的大小
- 零依赖 且与 `no_std` 兼容的 `alloc`
还有字节字符串、操作系统字符串和路径!
⚡ 示例
use hipstr::HipStr;
let simple_greetings = HipStr::from_static("Hello world");
let _clone = simple_greetings.clone(); // no copy
let user = "John";
let greetings = HipStr::from(format!("Hello {}", user));
let user = greetings.slice(6..): // no copy
drop(greetings); // the slice is owned, it exists even if greetings disappear
let chars = user.chars().count(); // "inherits" `&str` methods
✏️ 功能
std
(默认): 使用std
而不是core
和alloc
,并提供了更多的 trait 实现(用于比较、转换和错误)serde
: 提供serde
crate 的序列化/反序列化支持unstable
: 暴露可能随时更改的内部Backend
trait
☣️ `hipstr` 的安全性
此 crate 广泛使用 unsafe
。🤷
它利用大多数平台(我想是所有 Rustc 支持的平台)上存在的指针 2 位对齐利基,来区分内联表示和其他表示。
为了提高安全性,Rust 在多个平台上进行了彻底测试,通常与 Miri(MIR 解释器)一起。
🧪 测试
☔ 覆盖率
此 crate 具有近乎完整的行覆盖率
cargo llvm-cov --all-features --html
# or
cargo tarpaulin --all-features --out html --engine llvm
在 Codecov 上查看当前的覆盖率
🖥️ 跨平台测试
您可以使用 cross
在各种平台上轻松运行测试
cross test --target s390x-unknown-linux-gnu # 32-bit BE
cross test --target powerpc64-unknown-linux-gnu # 64-bit BE
cross test --target i686-unknown-linux-gnu # 32-bit LE
cross test --target x86_64-unknown-linux-gnu # 64-bit LE
注意:之前我使用MIPS目标的大端模式,但由于一些LLVM相关的问题,它们现在不再工作……请参阅 Rust问题#113065
🔍 Miri
该软件包在Miri上运行成功
MIRIFLAGS=-Zmiri-symbolic-alignment-check cargo +nightly miri test
for SEED in $(seq 0 10); do
echo "Trying seed: $SEED"
MIRIFLAGS="-Zmiri-seed=$SEED" cargo +nightly miri test || { echo "Failing seed: $SEED"; break; };
done
以检查不同的字长和字节序
# Big endian, 64-bit
cargo +nightly miri test --target mips64-unknown-linux-gnuabi64
# Little endian, 32-bit
cargo +nightly miri test --target i686-unknown-linux-gnu
📦 类似软件包
#[non_exhaustive]
名称 | 线程安全且经济的克隆 | 本地经济克隆 | 内联 | 经济切片 | 字节 | Cow<'a> | 注释 |
---|---|---|---|---|---|---|---|
hipstr |
🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 显然! |
arcstr |
🟢* | ❌ | ❌ | ❌** | ❌ | ❌ | *使用自定义的瘦Arc ,**重量级切片(具有专用子字符串类型) |
flexstr |
🟢* | 🟢 | 🟢 | ❌ | ❌ | ❌ | *使用一个Arc<str> 而不是一个Arc<String> (减少了一层间接引用但使用了胖指针) |
imstr |
🟢 | 🟢 | ❌ | 🟢 | ❌ | ❌ | |
faststr |
🟢 | ❌ | 🟢 | 🟢 | ❌ | ❌ | 零文档且API复杂 |
fast-str |
🟢 | ❌ | 🟢 | 🟢 | ❌ | ❌ | 内联表示是可选的 |
ecow |
🟢* | ❌ | 🟢 | ❌ | 🟢** | ❌ | *只有两个单词🤤,**甚至任何T |
cowstr |
🟢 | ❌ | ❌ | ❌* | ❌ | ❌** | *重量级切片,**与它的名称相反 |
compact_str |
❌ | ❌ | 🟢 | ❌ | 🟢* | ❌ | *通过smallvec 启用 |
inline_string |
❌ | ❌ | 🟢 | ❌ | ❌ | ❌ | |
smartstring |
❌ | ❌ | 🟢 | ❌ | ❌ | ❌ | |
smallstr |
❌ | ❌ | 🟢 | ❌ | ❌ | ❌ | |
smol_str |
❌ | ❌ | 🟢* | ❌ | ❌ | ❌ | *但只有内联字符串,这里仅供参考 |
跳过类似于tinystr
(仅ASCII,有界)或bstr、或bytestring等专用字符串类型
简而言之,HipStr
,一种字符串类型统治一切 😉
🏎️ 性能
虽然速度不是hipstr
的主要动机,但它似乎在这方面做得不错。
在我的i7-8550U上,在Arch Linux上(在Windows 11/WSL 2上),从切片创建HipStr
与其他软件包和std
具有竞争力
📖 作者和许可证
目前,只是我PoLazarus 👻
欢迎帮助! 🚨
MIT + Apache
依赖项
~0–305KB