Oli*_*ier 1 smart-pointers rust
我正在寻找类似于Arc/的智能指针,Rc但它不允许共享所有权。
我想要尽可能多的rc::Weak引用,但我只想要一个强引用,也就是所有者。我想用类型系统来强制执行。
Arc/Rc可以被克隆,它们可以在多个地方拥有。
卷起我自己的智能指针将是一种选择,但我相信这样的数据结构应该已经存在,即使在标准库之外。
我正在寻找一种提供这种接口的数据结构:
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>;
}
Run Code Online (Sandbox Code Playgroud)
让我们假设它与类型Strong<T>和 一起存在Weak<T>。你怎么用Weak<T>?您需要某种容易出错的“升级”步骤,那么Weak<T>升级到什么?它不能是简单的参考(如您所说),因为Strong<T> 需要知道是否Weak<T>存在任何“升级” 。如果没有,它可以在仍在访问该值的同时释放其存储空间。
所以,Weak<T>必须升级到某种SemiWeak<T>这使底层分配活着......这正是共同拥有的。
如果你以某种方式保证Strong<T>在所有Weak<T>s 消失之前不会被释放怎么办?恭喜,您刚刚重新发明了T并且&T:您可以直接使用它们。
好吧,那么如果你把它Weak<T>升级成一个SemiWeak<'a, T>与生命周期相关的东西,Weak<T>这样它就不能活得更久,而且只能是暂时的?在这种情况下,您真正要做的就是隐藏您拥有共享所有权的事实。在引擎盖下,SemiWeak仍然需要保证底层Strong不会消失。您可以Rc<T>在大约十分钟内轻松构建这样一个类型。这将有效地为您提供Rc<T>与完全相同的类型,具有相同的性能和内存成本,但不太有用。
此外,该get_mut方法不可能存在。没有办法阻止SemiWeak<T>s 的存在。除非您使用借用,但同样,这只是使用Tand &T。
所以,不,我不认为这存在,我也不相信它可以以您所描述的形式存在。
作为最后的一边,只是有Weak<T> 在所有的共享所有权的一种形式,因为那些Weak<T>小号需要点东西。在 的情况下Rc<T>,弱计数器存储在强计数器旁边,因此虽然可以销毁值,但分配本身仍然存在。您可以将两者分开,但现在您要为两次分配和双重间接付费(可能会导致更多缓存未命中)。
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |