intrusive_ptr使用案例

  • 1 简介Boost::intrusive_ptr
  • 2 Demo1
  • 3 Demo 2
  • 4 内部部分API简要的实现
  • 5 有何作用?

1 简介Boost::intrusive_ptr

总体上讲:Boost::intrusive_ptr和shared_ptr功能上几乎是一致,唯一不同的是,计数器递增、递减可以由用户自定义。

// 递增计数器,注意:函数名是内置,必须写这个名字!!!
void intrusive_ptr_add_ref(T *p)// 递减计数器,注意:函数名是内置,必须写这个名字!!!
void intrusive_ptr_release(T *p)

下面分享下两个小案例

2 Demo1

假定,定义一个count_data,里面有一个计数器m_count。其中这个计数器就相当于shared_ptr的内置计数器,只不过intrusive_ptr可以单独操作。

  1. 简要实现intrusive_ptr_add_ref和intrusive_ptr_release
  2. counted_ptr就像shared_ptr一样智能,以至于根据m_count正确的析构对象
  3. counted_ptr weak_p(p.get(), false);,false相当于是weak_ptr(是一个观察者,不会增加引用计数),默认是shared_ptr
#include <iostream>
#include <boost/smart_ptr.hpp>struct count_data
{int m_count = 0;// other funtion or data
};// 下面两个函数是内置的,只需要填写计算变量++/--
void intrusive_ptr_add_ref(count_data *p) {++p->m_count;
}void intrusive_ptr_release(count_data *p) {if (--p->m_count == 0)delete p;
}int main(int argc, char *argv[])
{typedef boost::intrusive_ptr<count_data> counted_ptr;counted_ptr p(new count_data);assert(p);assert(p->m_count == 1); // p拥有counted_ptr p2(p);assert(p->m_count == 2); // 指针拷贝构造,p和p2同时拥有counted_ptr weak_p(p.get(), false); // 值为false,相当于weak_ptr,只是一个观察者,不会增加引用计数assert(weak_p->m_count == 2);       // p和p2同时拥有,weak_p观察者p2.reset(); // 将p2置零assert(!p2);assert(p->m_count == 1); // p拥有,weak_p观察者
}

3 Demo 2

目的: 更加简化计数管理,直接继承intrusive_ref_counter即可
下面的代码并没有使用intrusive_ptr_add_refintrusive_ptr_release,同时也不需要计数器m_count,更加像shared_ptr了。

  1. 直接继承intrusive_ref_counter,之类可以得到计算能力
  2. 头文件 <boost/smart_ptr/intrusive_ref_counter.hpp>
#include <iostream>
#include <boost/smart_ptr.hpp>
#include <boost/smart_ptr/intrusive_ref_counter.hpp>// Method2
struct count_data2 : public boost::intrusive_ref_counter<count_data2>
{/* data */
};int main(int argc, char *argv[])
{typedef boost::intrusive_ptr<count_data2> counted_ptr2;counted_ptr2 p(new count_data2);assert(p);assert(p->use_count() == 1); // p拥有,正确析构
}

4 内部部分API简要的实现

可以看出,

  1. intrusive_ptr在构造,析构调用intrusive_ptr_add_refintrusive_ptr_release进行计数管理
    intrusive_ptr(intrusive_ptr const & rhs): px( rhs.px ){if( px != 0 ) intrusive_ptr_add_ref( px );}~intrusive_ptr(){if( px != 0 ) intrusive_ptr_release( px );}
  1. reset相当于置零,其中this_type是intrusive_ptr<>,构造一个空的intrusive_ptr再和自己交换,当然也就置0了哈。
    void reset(){// 等效于intrusive_ptr<>().swap(*this)this_type().swap( *this );}

默认构造一个空的,px是指针,pn是计数器

    BOOST_CONSTEXPR intrusive_ptr() BOOST_SP_NOEXCEPT : px( 0 ){}

更加详细的代码。可以参考Boost的源码

5 有何作用?

既然intrusive_ptr和shared_ptr如此相像,那么intrusive_ptr有什么作用呢?
答:如果你的类中有了计数管理器,可以考虑intrusive_ptr,否则都用shared_ptr,因为shared_ptr不需要增加代码,灵活性很高。

Boost中intrusive_ptr使用案例相关推荐

  1. shell中while循环案例

    shell中while循环案例 新建一个文件:  while_test.sh  ,复制一下代码: i=0 while ((i < 9))                             ...

  2. boost::interprocess::intrusive_ptr用法的测试程序

    boost::interprocess::intrusive_ptr用法的测试程序 实现功能 C++实现代码 实现功能 boost::interprocess::intrusive_ptr用法的测试程 ...

  3. Boost中的Timer的使用——计算时间流逝

    使用Boost中的Timer库计算程序的运行时间 程序开发人员都会面临一个共同的问题,即写出高质量的代码完毕特定的功能.评价代码质量的一个重要标准就是算法的运行效率,也就是算法的运行时间.为了可靠的提 ...

  4. boost中bind的使用

    最近对boost的bind部分比较感兴趣,对其背后的机制进行了简单的分析,和大家分享一下. 注,我所看的代码是boost_1_64_0, 想来各个版本的差异不大. 定义函数 [cpp] view pl ...

  5. html文件在echarts中,老师,echarts中所有的案例都是.html属性的文件吗?

    置顶 老师参与 老师,echarts中所有的案例都是.html属性的文件吗? 我是管理员大大 发表于2019年11月26日 如下是echarts中的实例,想请教一下,这是什么属性的文件? app.ti ...

  6. boost中的mutex与lock

    最近在多线程编程中多次使用到mutex来互斥,看了下项目的代码,有自己封装的mutex类,也有直接使用boost::mutex的,而boost中关于mutex可谓令人眼花撩换.这里总结一下. 对于mu ...

  7. html有序列表设置混合编码,一组你值得拥有的 Markdown 中混用 HTML 案例

    一组你值得拥有的 Markdown 中混用 HTML 案例 2019-08-23 by Dron 前言 Markdown 基础语法(见附录)已经无法满足日益丰富的信息内容,好在 Markdown 支持 ...

  8. 【阅读笔记】联邦学习实战——联邦学习在智能物联网中的应用案例

    联邦学习实战--联邦学习在智能物联网中的应用案例 前言 1. 案例背景与动机 2. 历史数据分析 3. 出行时间预测模型 3.1 问题定义 3.2 构造训练数据集 3.3 模型结构 4 联邦学习实现 ...

  9. 计算机技术在物理教学中的应用,信息技术在物理教学中的运用案例与感悟

    信息技术在物理教学中的运用案例与感悟 利用信息技术辅助中学物理教学,可以将内容结构的表达多媒体化,变微观为宏观.变抽象为形象.变静态为动态.变不可操作为可操作过程,有效地激发学生的学习兴趣,产生浓厚的 ...

最新文章

  1. ORM查询语言(OQL)简介--概念篇
  2. 部分小区业主抵制人脸识别:我不在家,你都清楚
  3. JZOJ 3769. 【NOI2015模拟8.14】A+B
  4. 牛客训练四:Applese 涂颜色(费马小定理+快速幂)
  5. Oracle Minus 取差集
  6. 最近安装prestashop遇到莫名其妙的问题。突然毛瑟顿开了,create default language就出现错误...
  7. c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...
  8. JAVA程序员面试32问(附答案)(转载)
  9. 【面经】关于逻辑回归,面试官们都怎么问
  10. 和画意思相近的字_有没有类似“鸢语慕君年青筏画卿颜”这种古风情侣网名啊...
  11. What The F**k Python!!!
  12. TesterHome android app 编写历程(三)
  13. Scylladb学习笔记
  14. 【PBR系列一】PBR知识体系
  15. 标准H.460公私网穿越视频解决方案
  16. PRISM 下载安装
  17. 华为什么时候能升android10,华为手机什么时候升级安卓Q 华为首批适配Android10机型列表...
  18. 光盘刻录系列之二刻录光盘的程序步骤
  19. 数据库多表联查的方式
  20. 微商城分销系统软件首选—好分销微信三级分销系统源码定制

热门文章

  1. linx6.0.80 凝思安全操作系统安装注意事项
  2. PHP正则表达式验证手机号、邮箱、身份证号码、姓名等
  3. jq插件的基础知识,以及小demo
  4. 测试面试题:微信朋友圈点赞测试用例
  5. 利用深度学习进行交通灯识别_通过深度学习识别交通信号灯
  6. ide怎么设置方法中间加一道横线_苹果手机怎么录屏_iPhone如何录屏_iOS录屏方法...
  7. 多项目晶圆(Multi Project Wafer,MPW)
  8. 用Python 做一个拳皇模型,风迷当年的经典游戏——街头霸王
  9. 推荐 5 个超级炫酷的可视化项目
  10. Google Earth Engine APP——MODIS海洋表明温度chart图简单工具