- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些使用shared_ptr
的代码作为在我的应用程序中引用特定类型对象(称为T
)的标准方法。为了提高效率,我尝试谨慎使用make_shared
和std::move
和const T&
。但是,我的代码花了很多时间传递shared_ptr
s(我包裹在shared_ptr
中的对象是整个caboodle的中心对象)。更重要的是,shared_ptr
通常指向一个对象,该对象用作“无值”的标记;该对象是特定T
子类的全局实例,并且由于其refcount永远不会为零,因此它可以永久存在。
使用“无值”对象很不错,因为它以良好的方式响应发送到这些对象的各种方法,并表现出我希望“无值”的行为。但是,性能指标表明,我的代码中花费了大量时间来增加和减少该全局单例对象的refcount,使新的shared_ptr
引用该对象,然后销毁它们。举个例子:对于一个简单的测试用例,如果我将nullptr
粘贴在shared_ptr
中以指示“无值”,而不是使它们指向全局单例T
“无值”对象,则执行时间从9.33秒减少到7.35秒。这是非常重要的区别。如果运行在更大的问题上,该代码将很快用于在计算集群上进行多日运行。所以我真的需要加快速度。但是我也很想拥有我的“无值(value)”对象,这样我就不必在我的所有代码中都检查nullptr
,对此情况进行了特殊的处理。
所以。有没有办法吃我的蛋糕呢?特别是,我在想我可以通过某种方式将shared_ptr
子类化为一个可以与“无值”对象一起使用的“shared_immortal_ptr”类。子类的行为就像普通的shared_ptr
一样,但是它根本不会增加或减少其引用计数,并且会跳过所有相关的簿记。这样的事情可能吗?
我也在考虑制作一个内联函数,该函数可以在get()
上执行shared_ptr
,并且如果get()
返回nullptr
,则可以替换指向单例不朽对象的指针;我想,如果我在代码中的任何地方都使用了它,而从未在*
上直接使用->
或shared_ptr
,那我会被隔离。
还是针对这种情况,我还没有遇到另一个好的解决方案?
最佳答案
Galik询问了有关您的遏制策略的中心问题。我假设您已经考虑到这一点,并且有理由依赖shared_ptr作为一种公共(public)遏制策略,没有其他选择。
我不得不提出似乎有争议的建议。您所定义的是,您需要一种类型的shared_ptr,它永远不会有nullptr,但是std::shared_ptr
不会这样做,并且我检查了STL的各种版本,以确认提供的客户删除器不是解决方案的入口点。
因此,可以考虑制作自己的智能指针,也可以采用根据需要进行更改的指针。基本思想是建立一种shared_ptr,可以指示该shadow_pointer将其影子指针指向它不拥有的全局对象。
您有std::shared_ptr
的源代码。该代码不便于阅读。可能很难使用。这是一种途径,但是您当然可以复制源代码,更改 namespace 并实现所需的行为。
但是,在90年代中期将模板首次引入时代的编译器时,我们所有人要做的第一件事就是开始构建容器和智能指针。智能指针非常容易编写。它们很难设计(或曾经设计过),但是随后您有一个要建模的设计(您已经使用过)。
您可以实现shared_ptr的基本接口(interface)来创建替换对象。如果您很好地使用了typedef,则应该只在少数几个地方进行更改,但是至少搜索和替换将相当不错。
这是我建议的两种方法,两种方法都具有相同的功能。从库中采用shared_ptr,或者从头开始制作一个。您会惊讶地如此迅速地进行替换。
如果您采用std::shared_ptr
,则主要主题是了解shared_ptr如何确定应减少的值。在大多数实现中,shared_ptr必须引用一个节点,在我的版本中,它称为控制块(_Ref)。当引用计数达到零时,节点拥有要删除的对象,但是如果_Ref为null,则shared_ptr自然跳过该对象。但是,->和*之类的运算符或get函数不会费心检查_Ref,它们只是返回阴影或_Ptr(在我的版本中)。
现在,当调用重置时,_Ptr将设置为nullptr(或在我的源代码中为0)。分配给另一个对象或指针时将调用Reset,因此,即使使用对nullptr的分配,此操作也有效。关键是,对于您需要的这种新型的shared_ptr,您可以简单地更改行为,以便每当发生这种情况(重置为nullptr)时,都将_Ptr(shared_ptr中的阴影指针)设置为“无全局值”对象地址。
*,get或->的所有用法都将返回该无值对象的_Ptr,并且在另一个赋值中使用时将正确运行,或者再次调用reset,因为这些函数不依赖于影子指针来作用于节点,并且由于在这种特殊情况下该节点(或控制块)将为nullptr,因此shared_ptr的其余部分将表现为好像正确指向了nullptr一样-即,不删除全局对象。
显然,将std::pointer
更改为此类特定于应用程序的行为听起来很疯狂,但是坦率地说,这是性能工作使我们难以做的事情。否则会发生奇怪的事情,例如为了获得更高的C原始速度而偶尔放弃C++或汇编程序。
修改std::shared_ptr
源(作为副本用于此特殊目的)不是我要选择的(事实上,我已经遇到了您的情况的其他版本,因此数十年来我已经多次做出了选择)。
为此,我建议您构建一个基于策略的智能指针。我觉得很奇怪,我今天早些时候(或昨天,凌晨1:40)在另一篇文章中提出了这个建议。
我指的是Alexandrescu于2001年写的书(我认为这是Modern C++,有些单词我不记得了)。他介绍了loki,其中包括基于策略的智能指针设计,该设计仍在他的网站上发布并免费提供。
我认为,这个想法应该已经合并到shared_ptr中。
基于策略的设计被实现为模板类的范例,该模板类是从一个或多个参数中派生的,如下所示:
template< typename T, typename B >
class TopClass : public B {};
std::shared_ptr
和
std::weak_ptr
是单独的类,它们作为一个家族与其他家族(节点或控制块)进行交互,以提供智能指针服务。但是,在我多次使用的设计中,这两个是由同一顶级模板类构建的。在该设计中,shared_ptr和weak_ptr之间的区别在于模板的第二个参数中提供的附件策略。如果使用弱连接策略作为第二个参数实例化该类型,则它是一个弱指针。如果给出了强有力的附件策略,那将是明智的选择。
std::shared_ptr
不提供)。接口(interface)和许多代码是共享的,但是可以通过选择不同的策略来简单地构建几种不同类型的智能指针。要更改行为,可以在不更改现有代码的情况下插入新策略。目前,我同时使用了std::shared_ptr(几年前在boost时使用的)和我几年前开发的MetaPtr库,后者在我需要高性能或灵活选项(如您的库)时使用。
关于c++ - 有没有一种方法可以针对永久对象优化shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32774424/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在现代 IDE 中,有一个键盘快捷键可以通过键入文件名称来打开文件,而无需将手放在鼠标上。例如: Eclipse:Cmd|Ctrl + Shift + R -> 打开资源 IntelliJ:Cmd|C
有什么东西会等待事件发生(我正在等待的是 WebBrowser.DocumentCompleted),然后执行代码吗?像这样: If (WebBrowser.DocumentCompleted) 不会
我使用 PHP Minify,它很棒。但我的问题是,是否有任何 PHP 插件或其他东西可以自动检测 javascript/css 代码并自动缩小它?谢谢。 最佳答案 Javascript 压缩器? 看
有没有一种语言,类似什么CoffeeScript是JavaScript,编译成windows batch|cmd|command line的语言? 我指的cmd版本是基于NT的,尤其是XP sp3及以
我知道我可以 ,但是,我真的宁愿有一个任务,我可以从任何可以使用所有(或至少大部分)属性的操作系统调用 copy ,但这并没有消除 unix 上的权限。 我想知道是否已经有解决方案,或者我必须自己编
我正在使用 Vuejs(不使用 jQuery)开发一个项目,该项目需要像 jvectormap 这样的 map 但正如我所说,我没有使用 jQuery,那么是否有任何其他库可以在不使用 jQuery
想要进行一个简单的民意调查,甚至不需要基于 cookie,我不在乎投了多少票。有没有类似的插件或者简单的东西? 最佳答案 这是一个有用的教程 - 让我知道它是否适合您 using jQuery to
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
var FileBuff: TBytes; Pattern: TBytes; begin FileBuff := filetobytes(filename); Result := Co
我想要一个 vqmod xml 文件来添加一次上传多个图像的功能。身边有这样的事吗? 编辑:Opencart版本:2.1.0.1 最佳答案 最后我写了一个xml来添加到opencart 2.1.0.1
所以考虑这样的函数: public void setTemperature(double newTemperatureValue, TemperatureUnit unit) 其中Temperatur
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是 ggplot2 的新手,一直在尝试找到一个全面的美学列表。我想我理解它们的目的,但很难知道哪些可以在各种情况下使用(主要是几何图形?)。 Hadley 的网站偶尔会在各个几何图形的页面上列出可用
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
是否有任何 PHP 函数可以将整数转换为十万和千万? 900800 -> 9,00,800 500800 -> 5,00,800 最佳答案 由于您已在问题标签中添加了 Yii,因此您可以按照 Yii
使用 Clojure 一段时间后,我积累了一些关于它的惰性的知识。我知道诸如map之类的常用API是否是惰性的。然而,当我开始使用一个不熟悉的API(例如with-open)时,我仍然感到怀疑。 是否
我的项目需要一个像 AvalonDock 这样的对接系统,但它的最后一次更新似乎是在 2013 年 6 月。是否有更多...积极开发的东西可以代替它? 最佳答案 AvalonDock 实际上相当成熟并
我正在寻找一个可以逆转 clojure 打嗝的函数 所以 turns into [:html] 等等 根据@kotarak的回答,这现在对我有用: (use 'net.cgrand.enliv
我是一名优秀的程序员,十分优秀!