FreeCAD中智能指针分析

  1. 实现原理

FreeCAD中有两套智能指针,一个是OCC的智能指针handle,另一个是自己定义的智能指针Reference,两种智能指针都是通过引用计数方式管理指针。

   1.1 OCC智能指针handle

OCC在基础类包中定义了一个模板类handle,该类包含一个私有变量:

这个变量就是handle管理的实体指针,handle类重载了*、->、==等运算符,用户可以直接通过handle使用entity的公有方法和属性。Standard_Transient类中有个整数变量用于引用计数,如图所示。

为了支持在多线程下使用,引用计数通过微软提供的专用于数值锁定计算的API函数InterlockedIncrement和InterlockedDecrement来实现,如图所示。

只有继承Standard_Transient的类,才可以使用handle智能指针。

1.2 handle的使用

OCC所有继承于Standard_Transient的类,都可以使用handle智能指针。OCC是否使用handle提供了几点建议:

  • 对象在应用程序中生存周期长且需要多次引用,最好用handle操作对象;
  • 对象在算法中使用,生存周期有限,最好直接操作对象;
  • 对于像全局变量这种创建一次,但在应用程序全生命周期都存在的对象,最好用handle操作对象。

为了方便使用handle操作对象,OCC定义了一个Handle()宏,如图所示。

这样就可以直接通过宏来使用handle。例如:

另外,OCC许多类还定义了一个带Handle_前缀的类,例如Handle_Geom_Line,它使用通过宏定义一个handle的子类,方便直接使用handle,如图所示。

  1. 3 FreeCAD智能指针Reference 

FreeCAD自定义的Reference智能指针使用Handled类实现引用计数,Handle里面使用一个_lRefCount变量完成计数,该变量是QT实现的能进行原子操作的类型,因此能够保证多线程下计数的安全性。所有需要使用Reference机制的类必须直接或间接继承Handle类。

2.使用情况

FreeCAD中OCC相关的对象使用OCC的handle指针,FreeCAD自定义的Reference指针主要使用在获取系统或用户参数的对象中,如下图所示:

3.总结

FreeCAD使用两套智能指针,OCC的对象使用OCC的智能指针,FreeCAD参数类使用自定义的Reference指针,它们的实现机制大同小异,但其使用比较规范,值得学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/734479.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

购买服务器,并安装宝塔

前言: 我们在开发项目时,总会遇到一个问题,就是将我们开发好的项目上传的公网中。对于中小型的项目,我们可以通过购买服务器进行项目的上线。 我们的项目一般是部署在Linux环境中。如果你不是专业的运维人员,可能对于…

力扣1901.寻找峰值II

力扣1901.寻找峰值II 二分每一行 并用函数找出每一行中最大值的下标若最大值比其下面相邻的元素大 则上方一定存在峰值若最大值比其下面相邻的元素小 则下方一定存在峰值 class Solution {int indexmax(vector<int> &a){return max_element(a.begin(),a.end()) - …

解决js打开新页面百度网盘显示不存在方法:啊哦,你所访问的页面不存在了。

用js打开新页面open或window.location.href打开百度网盘后都显示&#xff1a;啊哦&#xff0c;你所访问的页面不存在了。 window.open(baidu_url); window.location.href baidu_url;在浏览器上&#xff0c;回车后网盘资源是可以打开的&#xff0c;刷新也是打开的。这是很奇怪…

C/C++ vector模拟实现

模拟实现&#xff1a; 框架 namespace yx {template<class T>class vector{public:typedef T* iterator;private:iterator _start;iterator _finish;iterator _end_of_storage;}; } 这里我们声明定义不分离 reverse() 新开一个空间&#xff0c;拷贝数据&#xff0c;然…

ardupilot开发 --- RTSP视频流 篇

我年轻时很穷&#xff0c;努力了几年&#xff0c;终于不再年轻了 0. 一些概念1. Ubuntu搭建RTSP服务器的方式2. 在Ubuntu上搭建RTSP服务器3. 推流4. 拉流、播放5. 借鉴的一些例子6. 其他参考文献 0. 一些概念 RTSP服务、RTSP推流、RTSP拉流&#xff0c;缺一不可&#xff0c;尤其…

平凉特色小吃,味蕾的诱惑之旅

平凉&#xff0c;这座历史悠久的城市&#xff0c;不仅拥有深厚的文化底蕴&#xff0c;更有着让人垂涎欲滴的特色小吃。每一种小吃都承载着当地人的情感与记忆&#xff0c;成为了平凉独特的饮食符号。平凉特色小吃酿皮更是别具风味。爽滑透明的凉皮&#xff0c;配上香辣可口的调…

亿联 AM610 M.2 SSD PCIE 3.0X2 128GB测评

亿联 AM610 M.2 SSD PCIE 3.0X2 128GB测评 厂商&#xff1a;union memory国产固态硬盘SSD。 接口&#xff1a;PCIE 3.0X2 协议&#xff1a;支持NVME 1.协议 固件&#xff1a;固件版本号11.82 读取量&#xff1a;18TB左右 写入量&#xff1a;14TB左右&#xff0c;NAND闪存约被编…

统信UOS 安装二级制版MySQL8.4

统信UOS 安装二级制版MySQL8.4 建立MySQL用户和用户组 sudo groupadd mysqlsudo useradd -r -g mysql -s /bin/false mysql下载MySQL安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz解压缩MySQL安装包 sudo tar -xvf m…

如何获取文件对应的路径

有时我们会把脚本文件复制到其他的路径或者电脑文件夹下&#xff0c;如果采用绝对路径的话&#xff0c;会发生找不到改文件&#xff0c;程序就会报错。那么我们如何避免这个问题呢&#xff1f;我们可以采用相对路径的方法。 可以看到&#xff0c;系统的当前路径"D:\python…

37 - 上级经理已离职的公司员工(高频 SQL 50 题基础版)

37 - 上级经理已离职的公司员工 selecte1.employee_id fromEmployees e1 left join Employees e2 on e1.manager_id e2.employee_id wheree2.manager_id is null and e1.manager_id is not null and e1.salary<30000;

【Qt】学习Day1

文章目录 Qt简介创建第一个Qt程序创建过程介绍main函数工程文件头文件控件源文件快捷键按钮控件常用API对象树坐标系 信号和槽自定义信号自定义槽函数触发自定义的信号案例-下课后&#xff0c;老师触发饿了信号&#xff0c;学生响应信号&#xff0c;请客吃饭重载信号连接信号La…

【tomcat】tomcat系统架构以及核心启动流程

对于web后端开发工程师来说&#xff0c;tomcat作为一个应用服务器框架本质上就是一个HTTP服务Servlet容器。研究过spring、spring mvc源码的同学应该了解&#xff0c;spring mvc其实就是基于Servlet规范实现的请求的转发路由、转发处理。而Spring和SpringMVC就是通过web.xml文件…

时序预测 | KAN+Transformer时间序列预测(Python)

预测效果 基本描述 KANTransformer时间序列预测 KAN作为这两年最新提出的机制&#xff0c;目前很少人用&#xff0c;很适合作为时间序列预测的创新点&#xff0c;可以结合常规的网络加上个优化方法做创新。适合功率预测&#xff0c;负荷预测&#xff0c;流量预测&#xff0c;浓…

MSPM0G3507——GPIO例程讲解1——input_capture

函数&#xff1a; 参数&#xff1a; 返回值&#xff1a; 主函数代码&#xff1a; #include "ti_msp_dl_config.h"extern volatile uint32_t interruptVectors[];int main(void) {SYSCFG_DL_init(); //把所有的LED灯和按键初始化了一…

css grid实现九宫格布局

常见的九宫格布局可以使用flex布局实现&#xff0c;但是flex布局有个致命的缺陷&#xff0c;比如3行3列的布局&#xff0c;当第不足3个元素的时候&#xff0c;元素依然是平局平铺的&#xff0c;这样就不满足九宫格的效果&#xff0c;这种情况&#xff0c;使用grid布局可以轻松搞…

对兼容各操作系统的Anki选择题模板的更新——提供更方便的笔记修改功能

2021年当我想做一个兼容各操作系统的Anki选择题模板的时候&#xff0c;到处搜索茧中网&#xff0c;根本找不到相关内容&#xff0c;直到偶然在github上看到Simon Lammer的Anki持久化模块&#xff0c;才算真正实现。现在再在茧中网上搜索兼容各种操作系统的Anki选择题模板&#…

【百问大模型01】GPT4o最新特性介绍

1、GPT4o 最大的特性是对话响应速度很快 端到端能力300ms&#xff1b;之前是语音转成文字&#xff0c;再来理解分析&#xff1b;现在是直接端到端。 1&#xff09;丰富的语音风格 2&#xff09;理解语音内外的内容 3&#xff09;发出非语音的声音 4&#xff09;自然而及时…

苹果mac电脑救星CleanMyMac让我的电脑重获新生!

&#x1f389; 发现电脑的救星&#xff01;CleanMyMac让我的电脑重获新生&#xff01; CleanMyMac绿色免费版下载如下&#xff1a;记得保存哈&#xff0c;以防失效&#xff1a; https://pan.quark.cn/s/9b08114cf404 CleanMyMac X2024全新版下载如下: https://wm.makeding.…

6/22 第四周 python操作word

学习到了word有四个段落&#xff0c;都可以通过python来操作。 并且课程的体系&#xff0c;只是一个启蒙&#xff0c;需要在公司的项目中熟悉&#xff0c;从而具备专项测试的能力。 后续每天的学习笔记也需要侧重于理解的部分。

阿里云发送验证码流程

目录 1. 阿里云短信服务简介 2. 阿里云验证码发送流程 2.1 申请阿里云短信服务 2.2 短信模板及阿里云秘钥 1.开发者可以在自己的应用程序中集成短信发送功能。绑定发起测试的手机号&#xff0c;需要绑定的手机号才能成功发送验证码&#xff0c;其他的用户手机号发送的验…