2 个版本

新版本 0.1.1 2024年8月25日
0.1.0 2024年8月23日

#2#max

Download history 105/week @ 2024-08-18

每月105次 下载

MIT/Apache

17KB
243

同志们,长期以来,资产阶级的猪们依靠 O(n) 复制字符串来维持他们的“所有权”生活方式。唉,对于 Rc<T>Arc<T> 来说,它们仍然受制于全球分配者的独裁统治。但欢呼吧!因为这个crate提供了一个真正的社会主义共享字符串类型,完全由人民定制的,为人民定制。

这个仅限安全的crate引入了两种新的泛型类型,OurStringOurBytes,它们是可定制的共享字符串/字节类型,对小型数据具有自动内联功能。作为共享类型,这些值是不可变的,克隆是 O(1)

第一个泛型参数是共享的“同志”类型,可以是 Rc<T>Arc<T>,其中 T 可以转换为/从 str[u8] 转换。值得注意的是,这包括 Stringstr 对于 OurString,以及 Vec<u8>[u8] 对于 OurBytes

第二个泛型参数是最大内联大小。增加此值允许存储更大的字符串(即,不进行分配),但也会增加结构体的整体大小。请注意,即使您将指定的最大大小设置得更大,内联也限制在 255 个字节。

示例

例如,我们可以使用这些类型创建一个与 String 具有相同大小的共享字符串类型,但内联长度可达 23 个字节,类似于其他一些 crate

# use std::rc::Rc;
# use our_string::OurString;
type MyString = OurString<Rc<str>, 23>;
assert_eq!(size_of::<MyString>(), size_of::<String>());

let a = MyString::from("hello world!");
assert_eq!(a, "hello world!");

然而,您可能注意到 Option<MyString> 比纯 MyString(与 String 不同)更大,但我们可以轻松地将一个字节的内联空间用于这种大小优化

# use std::rc::Rc;
# use our_string::OurString;
type MyString = OurString<Rc<str>, 22>;
assert_eq!(size_of::<Option<MyString>>(), size_of::<String>());

let a = MyString::from("hello world!");
assert_eq!(a, "hello world!");

在先前的示例中,我们使用 Rc<str> 而不是 Rc<String> 以避免在非内联情况下的双重间接引用。然而,Rc<str> 占用 16 个字节,而 Rc<String> 仅占用 8 个字节。因此,如果结构体的大小比可能的间接引用更重要,您可以使用类似以下的方式

# use std::rc::Rc;
# use our_string::OurString;
type MyString = OurString<Rc<String>, 15>;
assert_eq!(size_of::<MyString>(), 16);
assert_eq!(size_of::<String>(), 24);

let a = MyString::from("hello world!");
assert_eq!(a, "hello world!");

这个 crate 的重要优势在于您可以对字符串类型的布局有完全的控制权,API 保持完全不变。

  • 如果您想进行更多内联,请增加最大内联大小。
  • 如果您想节省空间,请减少最大内联大小。
  • 如果您想以牺牲一些结构体大小为代价来避免双重间接引用,请使用 Rc<str>
  • 如果您想尽可能减小结构体的大小,请使用 Rc<String>
  • 如果您需要线程安全,请使用 Arc<T> 而不是 Rc<T>
  • 如果您想在内部使用自定义字符串类型,请直接使用 Rc<WhateverYouWant>

选择权在您手中。

非标准模式

此包支持在开箱即用的 非标准模式 环境中构建。

无运行时依赖