也不是不行。
c++ 需要 enable_shared_from_this<T> 是因为 shared_ptr 的实现是两个堆上对象,然后 T*不能反查出保存了引用计数信息的对象地址
而Rc/Arc的实现是一个堆上对象,完全可以根据 &self 的地址计算出 Arc 的开头地址,然后塑形成 Arc
struct Rc<T: ?Sized> {
ptr: NonNull<RcBox<T>>,
phantom: PhantomData<RcBox<T>>,
}
从这里看出 Rc<T> 实际上就是一个 *RcBox<T>,RcBox的代码是:
struct RcBox<T: ?Sized> {
strong: Cell<usize>,
weak: Cell<usize>,
value: T,
}
所以:只需要用 T 的指针减去两个 usize 的大小,就得到了 *RcBox<T>,然后塑形成 Rc 就可以了
--
FROM 123.58.117.*