2 个版本
新版本 0.1.1 | 2024年8月25日 |
---|---|
0.1.0 | 2024年8月23日 |
#2 在 #max
每月105次 下载
17KB
243 行
同志们,长期以来,资产阶级的猪们依靠 O(n)
复制字符串来维持他们的“所有权”生活方式。唉,对于 Rc<T>
和 Arc<T>
来说,它们仍然受制于全球分配者的独裁统治。但欢呼吧!因为这个crate提供了一个真正的社会主义共享字符串类型,完全由人民定制的,为人民定制。
这个仅限安全的crate引入了两种新的泛型类型,OurString
和 OurBytes
,它们是可定制的共享字符串/字节类型,对小型数据具有自动内联功能。作为共享类型,这些值是不可变的,克隆是 O(1)
。
第一个泛型参数是共享的“同志”类型,可以是 Rc<T>
或 Arc<T>
,其中 T
可以转换为/从 str
和 [u8]
转换。值得注意的是,这包括 String
和 str
对于 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>
。
选择权在您手中。
非标准模式
此包支持在开箱即用的 非标准模式
环境中构建。