首页 > 其他分享 >阅读智能指针

阅读智能指针

时间:2022-08-18 10:55:33浏览次数:49  
标签:count Count Incref weak 智能 base 阅读 ptr 指针

shared_ptr

shared_ptr继承自_Ptr_base<_Ty>,是一个引用计数资源管理的类。

_Ptr_base是shared_ptr和weak_ptr的基类。

Ptr_base

image

Ptr_base持有两个数据成员,element_type和_Ref_count_base
对相同模板参数的shared_ptr可以访问,对一系列模板家族的_Ptr_base可以访问,对一系列模板参数的atomic可以访问。

element_type

image
element_type萃取了_Ty的类型,如果_Ty是数组,则萃取出元素的类型。

_Ref_count_base

通用的代码用于引用计数。

_Ref_count_base有两个虚函数,_Destroy和_Delete_this函数,第一个是销毁管理的资源,第二个是销毁自己。

image
还有两个原子类型,一个是_Uses,一个是_Weaks。

    bool _Incref_nz() noexcept { // increment use count if not zero, return true if successful
        auto& _Volatile_uses = reinterpret_cast<volatile long&>(_Uses);
#ifdef _M_CEE_PURE
        long _Count = *_Atomic_address_as<const long>(&_Volatile_uses);
#else
        long _Count = __iso_volatile_load32(reinterpret_cast<volatile int*>(&_Volatile_uses));
#endif
        while (_Count != 0) {
            const long _Old_value = _INTRIN_RELAXED(_InterlockedCompareExchange)(&_Volatile_uses, _Count + 1, _Count);
            if (_Old_value == _Count) {
                return true;
            }

            _Count = _Old_value;
        }

        return false;
    }

看一下_Incref_nz,这个函数叫做Inc(Increment) ref(reference),nz(not zero)。
增加引用计数,如果非零的话。

_InterlockedCompareExchange,会将第一个参数的值和第三个进行比较,如果相等,则用第二个参数与第一个参数交换,并返回旧值。

还有两个函数,_Incref和_Incwref,增加use count和weak reference count,_Incref和_Incref_nz,相比,是不需要考虑非零的。

然后是_Decref和_Decwref,一个是decrement use count,另一个是decrement weak reference count。
image
_Decref的use_count减少为0后,就会销毁资源,然后调用_Decwref,减少weak引用计数,而_Decwref只会减少weak reference count,当为0的时候,就会_Delete_this。

image
这里还有个返回use count,以及返回删除器的函数。

标签:count,Count,Incref,weak,智能,base,阅读,ptr,指针
From: https://www.cnblogs.com/pixel-Teee/p/16597934.html

相关文章

  • AI与物联网架构:从智能引擎到物联网平台 节选
    一种是大数据底层技术,指的就是各种大数据计算框架、存储系统、SQL引擎等等,这些技术比较通用,经过十几年的优胜劣汰,主流的技术产品相对比较集中,主要就是我上篇专栏讨论的Ma......
  • 迅为RK3588开发板Linux安卓12瑞芯微ARM核心板人工智能工业AI主板
      RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,采用8nm结构,将四核Cortex-A76和四核Cortex......
  • 布谷智能巡更打卡在养老看护领域的应用
    ——不需部署设备的房间级定位方案   随着全社会人口老龄化加剧,老年人的健康管理与日常护理成为一项不可或缺的社会服务。采用数字化技术强化对护工的日常行为管理......
  • 【论文阅读】RepVGG: Making VGG-style ConvNets Great Again
    原始题目:RepVGG:MakingVGG-styleConvNetsGreatAgain中文翻译:RepVGG:让VGG-风格的卷积网络们再次伟大发表时间:2021年1月11日平台:CVPR-2021来源:MEGVII(旷世)......
  • vue源码阅读—13—扩展之transition
      <style>.fade-enter-active,.fade-leave-active{transition:opacity5s;}.fade-enter,.fade-leave-to{......
  • java线程池源码阅读
    说明简单理解和使用可以参考:https://www.cnblogs.com/LQBlog/p/8735356.html类图接口Executor接口publicinterfaceExecutor{/***代表提交了一个任......
  • 有环快慢指针相遇问题
    quick快指针速度Vq=2Vs,slow慢指针速度Vs,首先在环内一定会相遇这里就不阐述了;(借用下别人的图(谢谢那位))背景:环的起点为X,从链表到X的距离为x,假设quick和slow在Z点相遇,且X到......
  • 家电上云后,智能家居如何构建场景化应用
    摘要:当智能家居行业正在从盲目的家电上云,转变为体验为主的场景驱动,AIoT企业如何具备持续的商业化能力?本文分享自华为云社区《【云享·伙伴】第8期:家电上云后,智能家居......
  • leetcode-双指针-21
    /**<p>给你一个数组<code>nums</code><em></em>和一个值<code>val</code>,你需要<strong><ahref="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3......
  • 收货地址智能解析
    收货地址智能解析简介用于根据文本自动解析出收货信息。使用解析用户地址信息-parseUserInfoclassSmartParseTest{@TestvoidparseUserInfo(){......