我指的是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
,从而要求其管理的obj是RefBase
的子级?甚至没有办法在编译时甚至运行时强制执行此要求。 (也许if(type()...
)Std library doesn't have such a requirement
...
经过进一步思考,是否可以提供灵活性的答案?
如果是,这如何提供灵活性?
最佳答案
这样可以节省内存分配。当你写:
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
继承,而T
将比较运算符设为public,而其他功能则设为protected。编辑
再三考虑,有很多编译时间检查。如果
incStrong
没有RefBase
成员,则编译将失败,并且几乎可以肯定不会编译,除非它是从T*
派生的。我仍然认为将RefBase*
转换为会是更好的检查方法,但是在那里可能已经足够了。