gpt4 book ai didi

rust - 如何获取 Arc<[T]> 的子切片

转载 作者:行者123 更新时间:2023-11-29 08:27:38 24 4
gpt4 key购买 nike

fn subslice(a: Arc<[T]>, begin: usize, end: usize) -> Arc<[T]> {
Arc::new(a[begin..end])
}

Arc<[T]> 的分片操作的上述“明显实现”不起作用,因为 a[begin..end]类型为 [T] ,这是未定尺寸的。 Arc<T>具有类型本身不需要的奇怪属性 T: Sized ,但是构造函数Arc::new确实如此,所以我不知道如何构建这个子切片。

最佳答案

你不能。

要解释为什么,让我们看看Arc是什么实际上是在幕后。

pub struct Arc<T: ?Sized> {
ptr: Shared<ArcInner<T>>,
}

Shared<T>是一个内部包装器类型,本质上相当于“*const T ,但不能为零”;所以它基本上是一个 &T没有一生。这意味着您不能在此级别调整切片;如果你这样做了,你最终会试图指向一个 ArcInner那不存在。因此,如果这是可能的,它必须涉及对 ArcInner 的一些操作。 .

ArcInner<T>定义如下:

struct ArcInner<T: ?Sized> {
strong: atomic::AtomicUsize,
weak: atomic::AtomicUsize,
data: T,
}

strongweak分别只是此分配的强句柄和弱句柄的数量。 data是分配的实际内容,内联存储。 这就是问题所在。

为了让您的代码按您的意愿工作,Arc不仅要引用data通过另一个指针(而不是将其内联存储),但它也必须将引用计数和数据存储在不同的地方,这样您就可以获取数据的一部分,但保留相同的引用计数。

所以你不能按照你的要求去做。


您可以代替做的一件事是将切片信息一起存储Arc . owning_ref crate 有 an example that does exactly this .

关于rust - 如何获取 Arc<[T]> 的子切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36245170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com