Android 原生强指针与 std::shared_ptr

标签 android c++ c++11 std native

我指的是 Refbase.h , Refbase.cppStrongPointer.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; 
}

为了调用 incStrongdecStrong 不失败。 . . othermPtr必须继承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/

相关文章:

android - 已弃用 HttpClient?

c++ - 我可以在 header 中定义和声明extern对象的任何方式吗?

c++ - 如何将使用默认参数的函数传递给 std::thread?

c++ - 在其命名空间之外定义的类成员函数

C++ 在没有打开控制台的情况下启动程序

c++ - 具有表达式模板的多维数组模板类

android - 在android模拟器中获取互联网连接

android - 更新至Android Studio 3.0和gradle版本4.1:debug/manifest.xml中的未知元素<action>。真的不知道该怎么办?

android - 类似于 App Inventor for Android 的桌面编程工具

c++ - vector<MyClass*> 的 lower_bound