Android 原生强指针 vs std::shared_ptr.
Android native strong pointer vs std::shared_ptr
我指的是 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::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
没有incStrong
成员,编译将失败,除非它派生自RefBase
,否则几乎可以肯定不会。 我仍然认为将T*
转换为RefBase*
会是一个更好的检查,但那里的那个可能已经足够好了。
它自动允许您从实现 RefBase 的任何对象创建 sp,而对于共享指针,您可以在尝试将原始指针包装到共享指针时射击自己的脚。
因此,对于shared_ptr您可能需要: http://en.cppreference.com/w/cpp/memory/enable_shared_from_this
对于 SP,您几乎可以安全地将原始指针传递给 SP Contructor。
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理