我指的是 Refbase.h , Refbase.cpp和 StrongPointer.h
在强指针的Android实现中,任何基于强指针的对象都必须继承refbase,即
sp<TheClass> theObj // TheClass must inherit from class RefBase
此要求可以在sp
方法之一的代码中看到:
template<typename T> sp<T>& sp<T>::operator =(T* other) {
if (other != NULL) {
other->incStrong(this);
}
if (mPtr != NULL) {
mPtr->decStrong(this);
}
mPtr = other;
return *this;
}
为了调用 incStrong
或 decStrong
不失败。 . . other
和mPtr
必须继承RefBase
问题
为什么 sp
的实现使得它管理的对象需要成为 RefBase
的子对象?甚至没有办法在编译时甚至运行时强制执行此要求。 (嗯,也许 if(type()...
)
Std library doesn't have such a requirement
...
进一步思考,答案是这提供了灵 active 吗?
如果是,这如何提供灵 active ?
最佳答案
它节省了内存分配。当你写:
std::shared_ptr<Foo> pFoo{new Foo(bar)};
pFoo
实际上有一个指向共享数据结构(分配在堆上)的指针,它有引用计数器,以及指向实际 Foo 对象的指针。通过使对象派生自 RefBase
,您可以将引用计数嵌入对象本身(节省额外的内存分配)。
有趣的是,从 C++11 开始,您可以使用 std::make_shared<Foo>
来避免额外的内存分配。它将执行单个内存分配并在其中构造共享数据结构和 Foo 对象。
事实上没有对 RefBase
的推导进行编译时检查是粗心。 m_ptr
应该声明为 RefBase *m_ptr
, 然后 operator *
(等)应该对 T*
进行 static_cast .事实上,我可能会制作 sp<T>
继承自 sp_base
其中比较运算符是公共(public)的,其他函数是 protected 。
编辑
转念一想, 有相当多的编译时检查。如果T
没有 incStrong
成员,编译将失败,而且几乎肯定不会,除非它派生自 RefBase
.我仍然认为转换 T*
到 RefBase*
会是一张更好的支票,但那里的支票可能已经足够好了。
关于Android 原生强指针与 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42142375/