Android 原生强指针 vs std::shared_ptr

2024-06-22

我指的是参考库.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(使用前将#替换为@)

Android 原生强指针 vs std::shared_ptr 的相关文章

随机推荐

  • Golang 有 libfaketime 替代品吗?

    我想自动化一些测试 我必须操纵系统时间来检查用 golang 编写的程序的身份验证行为 根据这个帖子 https stackoverflow com questions 36024872 libfaketime doesnt work wi
  • 如何生成0到1之间的随机数?

    我想生成 0 1 之间的随机数 我正在尝试以下操作 double r2 return rand 10000 10000 0 int SA double u u r2 但它不会产生预期的结果 我该如何修复它 在你的版本中rand 10000将
  • Json 数组的 Avro 架构

    假设我有以下 json id 1 text some text user id 1 id 1 text some text user id 2 对于这个对象数组来说 合适的 avro 模式是什么 简短回答 该对象数组的适当 avro 架构如
  • 当我调用 fillRoundRect() 时,只有 1 个角被圆化

    当运行此代码时 import java awt Color import java awt Graphics import java awt Graphics2D import java awt RenderingHints import
  • useEffect 钩子加载数据两次,我的意思是它运行了两次[重复]

    这个问题在这里已经有答案了 我正在尝试将数据加载到我的App js文件从后端反应 我使用 redux 构建了从后端到前端的整个数据获取和存储管道 这是代码 function App const dispatch useDispatch us
  • WordPress api v2 按标签过滤帖子

    如何使用 wordpress api v2 获取特定标签的所有帖子 例如 我有一个 ID 为 24 的标签 programming 如何获取包含此 id 的所有帖子 我试过了 wp json wp v2 posts filter tag 2
  • 如何提高PHP性能?

    我已经为 Facebook 创建了 PHP 应用程序 它使用 MySQL Memcached 并在 Centos 2 6 Ghz 和 2 GB RAM 上的 Lighttpd 上运行 它基本上是一个 PHP 文件 第一次运行后会被缓存 每次
  • 在 NestedScrollView 内部时,回收器视图对于大数据加载速度非常慢

    我已经添加了RecyclerView在我的里面NestedScrollView 基本上我希望 RecyclerView 与其他视图一起滚动 我面临的问题是 对于一小部分数据 它工作正常 但对于大量数据 200 个条目 每当我启动活动时 它都
  • MySQL C++ 连接器:获取 insert_id

    我正在使用 mysql 连接器 C 我的表中有一个 auto increment 列 我想在执行插入操作时获取插入 id 有人知道如何得到它吗 谢谢 我的代码是这样的 conn gt setAutoCommit 0 pstmt reset
  • 如何在桌面应用程序中使用 ZeroMQ

    我正在开发一个桌面应用程序 该应用程序部署在Windows和Mac平台上 作为应用程序的一部分 它应该与本机层进行通信 目前本机层和Java层之间的通信是使用套接字完成的 最近团队中有人建议使用zeroMQ 你们中的任何一位都可以澄清我的疑
  • 如何从 DateTime 获取 12 小时日期

    当我获得 DateTime Hour 属性时 我总是获得 24 小时时间 因此 6PM 会给我 18 我如何获得 12 小时 时间 这样 6PM 就给了我 6 我显然可以自己进行检查 但我假设有一个内置函数可以做到这一点 怎么样 DateT
  • UITableView cellForRowAt 中的 API 异步调用

    我有 UITableView 来显示文件列表 每个文件名都使用特定的代码组合进行编码 为了获得真实的文件名 我必须使用当前文件名调用我的服务器端 是否可以在 cellForRowAt indexPath 表视图委托函数上调用此类操作 var
  • 动态添加新选项卡到 mat-tab-group

    我正在使用 Angular v8 和 Angular Materials 特别是 mat tab group 和 mat tab 我想要像下面这样的东西 我希望能够单击 看起来像一个选项卡 结果是它将创建一个新选项卡 单击 后 我们将看到如
  • Google Play 开发者 API - 400 无效值 - InAppPurchases

    我的问题类似于this one https stackoverflow com questions 35019357 google play developer api query purchase token returns invali
  • 在第一次启动时显示另一个视图控制器,不再显示

    我正在使用 swift 制作一个应用程序 它有两个视图控制器 主页 登录页面 我想在第一次启动时显示登录页面 所以我使用了这段代码 class ViewController UIViewController override func sh
  • XNA 3D 碰撞矩阵不起作用

    我之前问过一个关于为什么我的碰撞不起作用的问题 我得到了一个很好的答案 这是有道理的 将我在 DrawModel 方法中所做的相同转换应用于 isCollision 方法 然而 这并没有奏效 我无法弄清楚如何在 isCollision 方法
  • Nodemailer/Gmail - 刷新令牌到底是什么?如何获取刷新令牌?

    我正在尝试在节点应用程序中使用简单的联系表单nodemailer 我希望所有消息都从我为此目的创建的 Gmail 帐户发送到我的个人邮箱 在客户端 我所做的就是获取客户的姓名 邮件 消息并将其发送到服务器 它在本地工作正常 但在部署时无法工
  • 从 SKScene 呈现 UIViewController

    我试图从 SKScene 呈现一个 UIViewController 但是应用程序崩溃了 这是我的代码 1 UIViewController vc self view window rootViewController helpVC Hel
  • 用于将分层平面数据(带 ParentID)转换为带缩进级别的排序平面列表的算法

    我有以下结构 MyClass guid ID guid ParentID string Name 我想创建一个数组 其中包含按层次结构中应显示的顺序排列的元素 例如 根据它们的 左 值 以及将 guid 映射到缩进级别的散列 例如 ID N
  • Android 原生强指针 vs std::shared_ptr

    我指的是参考库 h https android googlesource com platform frameworks native jb dev include utils RefBase h 参考库 cpp https android