Boost中intrusive_ptr使用案例
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可以单独操作。
- 简要实现intrusive_ptr_add_ref和intrusive_ptr_release
- counted_ptr就像shared_ptr一样智能,以至于根据m_count正确的析构对象
- 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_ref和intrusive_ptr_release,同时也不需要计数器m_count,更加像shared_ptr了。
- 直接继承intrusive_ref_counter,之类可以得到计算能力
- 头文件 <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简要的实现
可以看出,
- intrusive_ptr在构造,析构调用intrusive_ptr_add_ref和intrusive_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 );}
- 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使用案例相关推荐
- shell中while循环案例
shell中while循环案例 新建一个文件: while_test.sh ,复制一下代码: i=0 while ((i < 9)) ...
- boost::interprocess::intrusive_ptr用法的测试程序
boost::interprocess::intrusive_ptr用法的测试程序 实现功能 C++实现代码 实现功能 boost::interprocess::intrusive_ptr用法的测试程 ...
- Boost中的Timer的使用——计算时间流逝
使用Boost中的Timer库计算程序的运行时间 程序开发人员都会面临一个共同的问题,即写出高质量的代码完毕特定的功能.评价代码质量的一个重要标准就是算法的运行效率,也就是算法的运行时间.为了可靠的提 ...
- boost中bind的使用
最近对boost的bind部分比较感兴趣,对其背后的机制进行了简单的分析,和大家分享一下. 注,我所看的代码是boost_1_64_0, 想来各个版本的差异不大. 定义函数 [cpp] view pl ...
- html文件在echarts中,老师,echarts中所有的案例都是.html属性的文件吗?
置顶 老师参与 老师,echarts中所有的案例都是.html属性的文件吗? 我是管理员大大 发表于2019年11月26日 如下是echarts中的实例,想请教一下,这是什么属性的文件? app.ti ...
- boost中的mutex与lock
最近在多线程编程中多次使用到mutex来互斥,看了下项目的代码,有自己封装的mutex类,也有直接使用boost::mutex的,而boost中关于mutex可谓令人眼花撩换.这里总结一下. 对于mu ...
- html有序列表设置混合编码,一组你值得拥有的 Markdown 中混用 HTML 案例
一组你值得拥有的 Markdown 中混用 HTML 案例 2019-08-23 by Dron 前言 Markdown 基础语法(见附录)已经无法满足日益丰富的信息内容,好在 Markdown 支持 ...
- 【阅读笔记】联邦学习实战——联邦学习在智能物联网中的应用案例
联邦学习实战--联邦学习在智能物联网中的应用案例 前言 1. 案例背景与动机 2. 历史数据分析 3. 出行时间预测模型 3.1 问题定义 3.2 构造训练数据集 3.3 模型结构 4 联邦学习实现 ...
- 计算机技术在物理教学中的应用,信息技术在物理教学中的运用案例与感悟
信息技术在物理教学中的运用案例与感悟 利用信息技术辅助中学物理教学,可以将内容结构的表达多媒体化,变微观为宏观.变抽象为形象.变静态为动态.变不可操作为可操作过程,有效地激发学生的学习兴趣,产生浓厚的 ...
最新文章
- ORM查询语言(OQL)简介--概念篇
- 部分小区业主抵制人脸识别:我不在家,你都清楚
- JZOJ 3769. 【NOI2015模拟8.14】A+B
- 牛客训练四:Applese 涂颜色(费马小定理+快速幂)
- Oracle Minus 取差集
- 最近安装prestashop遇到莫名其妙的问题。突然毛瑟顿开了,create default language就出现错误...
- c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...
- JAVA程序员面试32问(附答案)(转载)
- 【面经】关于逻辑回归,面试官们都怎么问
- 和画意思相近的字_有没有类似“鸢语慕君年青筏画卿颜”这种古风情侣网名啊...
- What The F**k Python!!!
- TesterHome android app 编写历程(三)
- Scylladb学习笔记
- 【PBR系列一】PBR知识体系
- 标准H.460公私网穿越视频解决方案
- PRISM 下载安装
- 华为什么时候能升android10,华为手机什么时候升级安卓Q 华为首批适配Android10机型列表...
- 光盘刻录系列之二刻录光盘的程序步骤
- 数据库多表联查的方式
- 微商城分销系统软件首选—好分销微信三级分销系统源码定制
热门文章
- linx6.0.80 凝思安全操作系统安装注意事项
- PHP正则表达式验证手机号、邮箱、身份证号码、姓名等
- jq插件的基础知识,以及小demo
- 测试面试题:微信朋友圈点赞测试用例
- 利用深度学习进行交通灯识别_通过深度学习识别交通信号灯
- ide怎么设置方法中间加一道横线_苹果手机怎么录屏_iPhone如何录屏_iOS录屏方法...
- 多项目晶圆(Multi Project Wafer,MPW)
- 用Python 做一个拳皇模型,风迷当年的经典游戏——街头霸王
- 推荐 5 个超级炫酷的可视化项目
- Google Earth Engine APP——MODIS海洋表明温度chart图简单工具