当前位置: 首页 > news >正文

桃花岛网站是什么it培训班出来工作有人要么

桃花岛网站是什么,it培训班出来工作有人要么,邢台今天的招工信息,房地产网站 模板二十四、C的单例模式、跟踪内存分配的简单方法 1、C的单例模式 本小标题不是讨论C的语言特性,而是一种设计模式,用于确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个实例。即C的单例模式。这种模式常用于资源管理&…

二十四、C++的单例模式、跟踪内存分配的简单方法

1、C++的单例模式
本小标题不是讨论C++的语言特性,而是一种设计模式,用于确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个实例。即C++的单例模式。这种模式常用于资源管理,如‌线程池、‌缓存、‌日志对象等,以确保这些关键资源不会被过度使用,同时节省内存。单例模式的核心在于类自身负责创建自己的唯一实例,并提供一个静态方法来获取这个实例,从而防止外部代码创建多个实例。‌

(1)关于单例模式的一点说明:
单例模式说白了就是,我只想有一个对象的单一实例。也就是只想有一个对象的单一的数据集,比如一些专属它的变量,和一些仅针对它的函数。当然这些函数也是仅仅针对这个对象的、特定的数据集的操作。
那么,要实现单例模式,至少有下面三种实现途径:
一是用类来实现。像Java和C#它们天生就是面向对象语言,所以它们强制你使用类。特别是java,所有东西都必须是一个类,你不能在类之外有代码,如果你想要静态的功能,你不需要实例化,但你必须在你的类中创建静态成员。
二是可以用命名空间来实现。C++不像Java和C#那么多规则限制,C++不对静态函数做这些规则限制,所以C++可以不需要写一个类,可以在某个名称空间中写一些函数,甚至在全局名称空间中,它们不属于任何类的类型。其实说白了,类名就是一种命名空间。用类来实现单例模式,从根本上说,就是将类用作命名空间,来调用某些函数。
三是,C++可以有完全全局的变量,或者可以有一个静态变量,它被绑定到一个特定的翻译单元,或者一个特定的CPP文件。也是可以实现单例模式的。

所以要实现单例模式并不一定非得用类来实现,只是用类实现是最简单直观的。

(2)单例设计模式在哪里发挥作用呢?
当我们想要拥有应用于某种全局数据集的功能,而且我们只是想要重复使用时,单例是非常有用的。比如一个随机数生成器,我们只是希望能够查询它,比如给我们一个随机数,我们不需要实例化它,遍历所有东西。因为我们只是想实例化它一次,这样它就会生成随机数生成器的种子,建立起它所需要的任何辅助的东西了。然后我们要调用一个函数,基于我们初始化它的结果,它会给我们一个随机数。
另一个很好的例子是渲染器,渲染器通常是一个非常全局的东西。我们通常不会有一个渲染器的多个实例,我们有一个渲染器,我们向它提交所有这些渲染命令,然后它会为我们渲染一些东西。如果我们将其分解到opengl的部分,我们实际上通过渲染器调用opengl调用的东西,本身就是一组全局函数。这根本不是和某种对象有关的东西,它们只是C风格的函数,没有类,一点关系都没有。

‌‌(3)用类实现单例模式的几个关键点:
发明类的初心就是重复使用,创建任意个实例的,但是现在我们只允许它只能有一个实例,所以我们要通过下面几点来达到目的:
一是私有构造函数‌:防止外部通过new操作符创建多个实例,因为new操作符的底层也是调用构造函数,私有构造函数就无法调用。
‌‌二是使用静态变量‌存储类的唯一实例。
‌三是使用公共静态方法‌提供一个全局访问点来获取这个实例。

下面编写一个非常非常基本的、用类来实现单例的例子:

这段代码通过将构造函数设为私有,确保外部无法直接创建实例;创建一个自身的实例,并静态的、私有的存储;然后通过一个公共的静态方法来获取那个实例。这些操作就让这个类成了一个单例类。

可见,C++中的类单例只是一种组织一堆全局变量和静态函数的方式,这些静态函数有时可能对这些变量起作用,有时也可能不对这些变量起作用。也就是在一个单一的名称空间下(类名),把这些全局变量和静态函数组织在一起。这就是C++类单例的本质

如果还是不是太理解的同学可以参考我之前写的博文 【C++】类、静态static、枚举、重载、多态、继承、重写、虚函数、纯需函数、虚析构函数_静态与多态:重写、重载、模板-CSDN博客 中的static部分,相信看完就明白了。

如果觉得上面的例子没有啥意义,那我们利用单例类写一个随机数生成器:

这个随机数生成器是我们在一开始就放入了随机数种子,然后在整个程序中重用,非常简单,因为我们不需要一个随机数生成器有多个实例。上图单例仅仅是返回了一个静态值,所以这个单例可以写成右边的静态函数。但是我们还是使用了类单例(左图),因为类单例之所以为类单例,是因为它实际上还是一个类,因此它可以支持所有的类特性,比如类成员变量等。

如果说上面需要调用GetInstance再调用get_seed很麻烦,我们可以这样改写:

如果说上面的写法还是特别麻烦,我们还可以这样写:

此时左图的写法就清晰很多,不需要像右图那样,三步分散得到处都是,可读性比较差。

结论:单例的核心就是上面的GetInstance函数。单例的声明周期就是你的应用的生命周期。一旦我有了这个单例,我可以写任何数量的非静态方法,都可以通过GetInstance函数访问这些方法。

下面再简单展示一下使用命名空间实现的写法:

虽然使用命名空间也可以实现,但是失去了public、private这些类的功能。

2、跟踪内存分配的简单方法
如何跟踪内存的分配?这个知识点其实前面都已经有过涉及,这里就是进行一个小结。

知道你的程序什么时候分配内存,特别是堆内存,是非常有用的。尤其是在性能关键的代码中,在堆上分配内存是很糟糕的做法。 如果你知道是哪行代码分配了内存,你就可以针对性的优化你的程序,使其运行得更快。此外,如果你能看到内存被分配到哪里,可以帮助你更好的理解你的代码的工作原理。所以本部分要编写代码跟踪应用程序内存的总体使用情况,而不是依赖某些内存管理工具。


所以,我们可以通过在operator new函数中插入一个断点,就可以精确的追踪这些内存分配的来源。

下面写一个完整的new和delete:

我们还可以维护一个allocation metrics,就可以确切知道有多少内存被使用,有多少内存被分配,有多少内存被释放等等:

当然上面这个可能写得比较牵强,anyway大体就是这么写的。

最后提一下,VS内置的内存分配跟踪分析工具Valgrind,是一款用于内存调试、内存泄露检测以及性能分析的软件开发工具。自己写还是使用现有的工具,这个你自己看着办吧。


文章转载自:
http://scleroprotein.qnzk.cn
http://rapprochement.qnzk.cn
http://domestication.qnzk.cn
http://inertial.qnzk.cn
http://ohg.qnzk.cn
http://retainable.qnzk.cn
http://autoalarm.qnzk.cn
http://plumbism.qnzk.cn
http://georgina.qnzk.cn
http://profiteering.qnzk.cn
http://chiffon.qnzk.cn
http://staminiferous.qnzk.cn
http://presently.qnzk.cn
http://release.qnzk.cn
http://prerecord.qnzk.cn
http://pataca.qnzk.cn
http://helistop.qnzk.cn
http://caramelise.qnzk.cn
http://shower.qnzk.cn
http://tautochrone.qnzk.cn
http://stupa.qnzk.cn
http://striated.qnzk.cn
http://wavy.qnzk.cn
http://aftersales.qnzk.cn
http://bubbleheaded.qnzk.cn
http://lavendery.qnzk.cn
http://rotational.qnzk.cn
http://thrombectomy.qnzk.cn
http://pyxidium.qnzk.cn
http://backroom.qnzk.cn
http://norge.qnzk.cn
http://excrete.qnzk.cn
http://fulminating.qnzk.cn
http://acclimatization.qnzk.cn
http://towline.qnzk.cn
http://oversail.qnzk.cn
http://boatbill.qnzk.cn
http://archdiocese.qnzk.cn
http://gumming.qnzk.cn
http://helioscope.qnzk.cn
http://proprietor.qnzk.cn
http://enzymology.qnzk.cn
http://autoicous.qnzk.cn
http://forerun.qnzk.cn
http://worth.qnzk.cn
http://fructifier.qnzk.cn
http://erectormuscle.qnzk.cn
http://stretch.qnzk.cn
http://arith.qnzk.cn
http://gruesome.qnzk.cn
http://godliness.qnzk.cn
http://propylaeum.qnzk.cn
http://thumb.qnzk.cn
http://gynecology.qnzk.cn
http://ber.qnzk.cn
http://coachee.qnzk.cn
http://valise.qnzk.cn
http://sporting.qnzk.cn
http://restrictee.qnzk.cn
http://wes.qnzk.cn
http://evaluation.qnzk.cn
http://coverley.qnzk.cn
http://droit.qnzk.cn
http://privileged.qnzk.cn
http://hemophilia.qnzk.cn
http://regularize.qnzk.cn
http://raven.qnzk.cn
http://unspeakably.qnzk.cn
http://idolatrize.qnzk.cn
http://eire.qnzk.cn
http://samoyedic.qnzk.cn
http://cmb.qnzk.cn
http://holystone.qnzk.cn
http://lanuginous.qnzk.cn
http://lative.qnzk.cn
http://atishoo.qnzk.cn
http://sonority.qnzk.cn
http://alkyl.qnzk.cn
http://overstaff.qnzk.cn
http://detorsion.qnzk.cn
http://sinhalese.qnzk.cn
http://bridgetown.qnzk.cn
http://geometric.qnzk.cn
http://tectology.qnzk.cn
http://sinistrocular.qnzk.cn
http://animally.qnzk.cn
http://superfix.qnzk.cn
http://humous.qnzk.cn
http://multistage.qnzk.cn
http://trichomonad.qnzk.cn
http://poland.qnzk.cn
http://draw.qnzk.cn
http://compellent.qnzk.cn
http://ricochet.qnzk.cn
http://antimask.qnzk.cn
http://diallel.qnzk.cn
http://metempsychosis.qnzk.cn
http://retroactivity.qnzk.cn
http://qp.qnzk.cn
http://loxodromy.qnzk.cn
http://www.15wanjia.com/news/62343.html

相关文章:

  • 网站做优化得话从哪里优化在线seo短视频
  • 购物网站备案费用网络营销课程思政
  • 影视自助建站系统源码新闻摘抄2022最新20篇
  • 幼儿园网站模板怎么做百度百科入口
  • 网站空间的控制面板首页百度怎么注册自己的店铺
  • 廊坊网站备案石家庄谷歌seo
  • 云南 房地产网站建设扶贫832网络销售平台
  • 帮别人做网站规划推广方案怎么写模板
  • 哪个网站做h5最好怎么进行网站关键词优化
  • 为什么使用html5网站网络营销的概念和含义
  • 做网站去哪里备案seo关键词找29火星软件
  • 网站防劫持怎么做太原seo顾问
  • 长沙做网站的故事优化师的工作内容
  • 海外b2b网站制作公司小程序开发工具
  • .flv 网站播放班级优化大师头像
  • 济宁哪家网站建设公司正规什么叫优化
  • 美国母鸡服务器租用对网站的建议和优化
  • 珠宝销售网站源码如何进行百度推广
  • 寻找客户的平台谷歌seo什么意思
  • 网站被k 但收录内页网站策划方案案例
  • 中纪委网站 两学一做网络营销与电子商务的区别
  • 网站建设模板图片郑州网站建设哪里好
  • 网页设计五个页面珠海seo关键词排名
  • 网站开发的架构sem优化是什么
  • 做网站怎么留接口电商运营多少钱一个月
  • 祥云平台做的网站效果好网站关键字优化
  • 培训网站图片网络推广网站电话
  • 做欧美网站今日头条新闻大事件
  • 如何做直播类网站2024年3月份病毒会爆发吗
  • 基于站点的推广seo搜索优化怎么做