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 2020 年 1 月 31 日

#554Rust 模式

Download history 103/week @ 2023-11-18 124/week @ 2023-11-25 63/week @ 2023-12-02 408/week @ 2023-12-09 489/week @ 2023-12-16 448/week @ 2023-12-23 218/week @ 2023-12-30 147/week @ 2024-01-06 207/week @ 2024-01-13 105/week @ 2024-01-20 147/week @ 2024-01-27 119/week @ 2024-02-03 147/week @ 2024-02-10 301/week @ 2024-02-17 149/week @ 2024-02-24 96/week @ 2024-03-02

716 每月下载次数
18 crate 中使用 (5 个直接使用)

MIT/Apache

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

稳定性修复

这些修复只有在您使用 Rust 1.42 或更高版本时才会产生影响,并且不会造成已知的编译错误(甚至不会在 miri 中失败)。然而,出于谨慎,我们仍然决定撤销 1.1 线上所有版本的 slice-dst,并敦促您尽快升级到 1.2。

改进

  • 之前,在构造一个瘦切片 DST 时,如果构造过程中发生 panic,则会泄漏分配的内存。#44 修复了大多数情况,使其能够正确清理。

1.1.0

稳定性修复

  • alloc_slice_dst(_in) 现在正确支持零大小类型。
  • erasable:擦除指针的具体类型。
  • ptr-union:指针大小指针联合。
  • rc-borrowRcArc 的借用形式。
  • rc-boxRcArc 的已知唯一形式。

最低支持的 Rust 版本

我们需要最低的 Rust 版本为 1.41.0。这是为了调整局部特质实现检查。

由于依赖关系处理方式,最低版本支持仅通过最小版本解析 (-Z 最小-版本/--minimal-versions) 保证。Rust 的最低版本只有在小版本升级时才会增加,而不是补丁版本升级,这将在变更说明中明确指出。

许可

根据您的选择,许可如下:

如果您是任何公司的高薪工作者,该公司将利润置于人之上,您仍然可以使用这个 crate。我仅仅希望您能够联合起来,抵制您的工作场所中普遍存在的对增长、控制和权力的痴迷。请站出来反对他们强加给低薪同事的恶劣工作条件,以及他们对其声称要捍卫的人权的蔑视。

贡献

除非您明确表示,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖项