7 个稳定版本
1.5.1 | 2020 年 6 月 22 日 |
---|---|
1.4.1 | 2020 年 5 月 13 日 |
1.3.0 | 2020 年 4 月 11 日 |
1.2.1 | 2020 年 3 月 19 日 |
1.0.0 |
|
#554 在 Rust 模式
716 每月下载次数
在 18 个 crate 中使用 (5 个直接使用)
66KB
813 行
支持自定义基于切片的 DST。
通过手动处理分配,我们可以手动为自定义 DST 分配 Box
。只要大小与预期相符,一旦创建元数据,Rust 实际上已经完美地处理了它所支持的 DST,安全!设置它们是困难的部分,这个 crate 会为您处理。
示例
我们有一个树结构!每个节点包含一些数据和其子节点数组。在正常的 Rust 中,你可能通常这样实现
struct Node {
data: &'static str,
children: Vec<Arc<Node>>,
}
let a = Node { data: "a", children: vec![] };
let b = Node { data: "b", children: vec![] };
let c = Node { data: "c", children: vec![] };
let abc = Node { data: "abc", children: vec![a.into(), b.into(), c.into()] };
在这种设置下,内存布局看起来像以下示意图
+--------------+
|Node |
+---->|data: "a" |
+------------+ +---------------+ | |children: none|
|Node | |Vec<Arc<Node>> | | +--------------+
|data: "abc" | |[0]: +--------------+ |Node |
|children: +----->|[1]: +------------------->|data: "b" |
+------------+ |[2]: +--------------+ |children: none|
+---------------| | +--------------+
| |Node |
+---->|data: "c" |
|children: none|
+--------------+
然而,这个 crate 可以将子节点数组存储在与节点数据一起
struct Node(Arc<SliceWithHeader<&'static str, Node>>);
let a = Node(SliceWithHeader::new("a", None));
let b = Node(SliceWithHeader::new("b", None));
let c = Node(SliceWithHeader::new("c", None));
// this vec is just an easy way to get an ExactSizeIterator
let abc = Node(SliceWithHeader::new("abc", vec![a, b, c]));
+-----------+
+-------------+ |Node |
|Node | +---->|length: 0 |
|length: 3 | | |header: "a"|
|header: "abc"| | +-----------+
|slice: [0]: +-----+ |Node |
| [1]: +---------->|length: 0 |
| [2]: +-----+ |header: "b"|
+-------------+ | +-----------+
| |Node |
+---->|length: 0 |
|header: "c"|
+------------
你何时想使用这个而不是标准类型,具体时间可能会有所不同。这主要用于空间优化非常重要的情况。当使用区域时,它通过将节点有效载荷移动到与子节点数组一起的堆上,来减少区域中的分配。
变更列表
1.5.0
新增
- 添加了
SliceWithHeader::from_slice
,这是针对Copy
类型切片的_::new
的特化,可以避免一些簿记开销。
1.4.0
新增
- 添加了
TryAllocSliceDst
,它是AllocSliceDst
的可错误类比。
1.3.0
新增
- 添加了
StrWithHeader
类型,是SliceWithHeader
的对应类型,但使用str
。
1.2.0
稳定性修复
-
alloc_slice_dst
(_in
) 不小心错误地使用了slice::from_raw_parts_mut
而不是ptr::slice_from_raw_parts_mut
,尽管后者在 Rust 版本^1.42.0
上可用。更多信息,请参阅 修复的 PR。 -
构建脚本检查
ptr::slice_from_raw_parts_mut
的稳定化存在错误,总是失败,导致使用slice::from_raw_parts_mut
。技术细节请参阅 修复的 PR。
这些修复只有在您使用 Rust 1.42 或更高版本时才会产生影响,并且不会造成已知的编译错误(甚至不会在 miri 中失败)。然而,出于谨慎,我们仍然决定撤销 1.1 线上所有版本的 slice-dst,并敦促您尽快升级到 1.2。
改进
- 之前,在构造一个瘦切片 DST 时,如果构造过程中发生 panic,则会泄漏分配的内存。#44 修复了大多数情况,使其能够正确清理。
1.1.0
稳定性修复
alloc_slice_dst
(_in
) 现在正确支持零大小类型。
相关 Crates
最低支持的 Rust 版本
我们需要最低的 Rust 版本为 1.41.0。这是为了调整局部特质实现检查。
由于依赖关系处理方式,最低版本支持仅通过最小版本解析 (-Z 最小-版本
/--minimal-versions
) 保证。Rust 的最低版本只有在小版本升级时才会增加,而不是补丁版本升级,这将在变更说明中明确指出。
许可
根据您的选择,许可如下:
- Apache License,版本 2.0 (LICENSE/APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE/MIT 或 http://opensource.org/licenses/MIT)
。
如果您是任何公司的高薪工作者,该公司将利润置于人之上,您仍然可以使用这个 crate。我仅仅希望您能够联合起来,抵制您的工作场所中普遍存在的对增长、控制和权力的痴迷。请站出来反对他们强加给低薪同事的恶劣工作条件,以及他们对其声称要捍卫的人权的蔑视。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。