我指的是参考库.h https://android.googlesource.com/platform/frameworks/native/+/jb-dev/include/utils/RefBase.h, 参考库.cpp https://android.googlesource.com/platform/frameworks/native/+/jb-mr1-release/libs/utils/RefBase.cpp and 强指针.h https://android.googlesource.com/platform/frameworks/native/+/android-4.2.2_r1/include/utils/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
or decStrong
为了不失败。 。 。other
and mPtr
一定是继承了RefBase
QUESTION
Why is sp
实现它所管理的对象是required成为...的孩子RefBase
?甚至没有办法在编译时甚至运行时强制执行此要求。 (也许if(type()...
)
std库没有这样的要求 http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/
...
进一步思考,答案是这提供了灵活性吗?
如果是,这如何提供灵活性?
它节省了内存分配。当你写:
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 *
(等)应该进行 static_cast 来T*
。事实上,我可能会做sp<T>
继承自sp_base
其中比较运算符是公共的,其他函数是受保护的。
Edit
再想一想,有is相当多的编译时间检查。如果T
没有incStrong
会员,编译会失败,而且almost当然不会,除非它源自RefBase
。我仍然认为转换T*
to a RefBase*
本来会是一个better检查一下,但现有的可能已经足够好了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)