gpt4 book ai didi

rust - 是否存在具有单个强所有者和多个弱引用的共享指针?

转载 作者:行者123 更新时间:2023-11-29 08:23:30 25 4
gpt4 key购买 nike

我正在寻找类似于 Arc/Rc 的智能指针,只是它不允许共享所有权。

我想要尽可能多的 rc::Weak 引用,但我只想要 一个 强引用,也就是所有者。我想用类型系统强制执行。

Arc/Rc 可以被克隆,并且它们可以在多个地方拥有。

滚动我自己的智能指针是一种选择,但我相信这样的数据结构应该已经存在,即使在标准库之外。

我正在寻找提供这种接口(interface)的数据结构:

impl MySmartPointer<T> {
fn new(object: T) -> Self;
fn weak_ref(&self) -> WeakRef<T>;
fn get_mut(&mut self) -> &mut T;
}

impl WeakRef<T> {
/// If the strong pointer `MySmartPointer` has been dropped,
/// return `None`. Else return Some(&T);
fn get(&self) -> Option<&T>;
}

最佳答案

让我们假设它存在于类型 Strong<T> 中和 Weak<T> .你如何使用Weak<T> ?您需要某种容易出错的“升级”步骤,那么 Weak<T> 是做什么的?升级到?它不能是一个简单的引用(如你所说),因为 Strong<T> 需要知道是否有任何“升级”Weak<T>存在。如果没有,它可以在值仍在访问时释放其存储空间。

所以 Weak<T>必须升级到某种 SemiWeak<T>这使基础分配保持活力...这正是共享所有权

如果你以某种方式保证 Strong<T> 会怎么样?在所有 Weak<T> 之前无法解除分配走开?恭喜,您刚刚重新发明了 T&T : 您实际上可以只使用它们。

好吧,所以如果您做到了 Weak<T>升级为 SemiWeak<'a, T>这与 Weak<T> 的生命周期相关所以它不能比它长寿,只能是暂时的?在这种情况下,您真正​​要做的就是隐藏您拥有共享所有权的事实。在引擎盖下,SemiWeak仍然需要保证底层 Strong不能离开。您可以从 Rc<T> 轻松构建这样的类型大概十分钟后。这将有效地为您提供一个与 Rc<T> 完全相同的类型。 ,具有相同的性能和内存成本,但用处不大。

此外,get_mut方法不存在。没有办法阻止 SemiWeak<T>来自现有的。除非你使用借用,但同样,那只是使用 T&T .

所以,不,我认为这不存在,我也不相信它可以以您描述的形式存在。


最后,只有 Weak<T> at all 是一种共享所有权的形式,因为那些 Weak<T> 需要指向某物。在Rc<T>的情况下,弱计数器存储在强计数器旁边,因此虽然值可能被破坏,分配本身仍然存在。您可以将两者分开,但现在您要为两次分配双间接寻址付费(可能导致更多缓存未命中)。

关于rust - 是否存在具有单个强所有者和多个弱引用的共享指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50751606/

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