派生类中的成员new/delete重载是否有用?

Pot*_*ter 18 c++ inheritance operator-overloading new-operator

我刚刚回答了一个关于缺少与新位置相对应的展示位置删除的问题.原因似乎operator delete是根据对象的动态类型调用的方式(对应于用于查找的类型operator new).

安置new对我有用.在自定义分配方面,可能存在一个可重用的类,其中不同的实例管理不同的池.单身人士是一种反模式,所有这一切.

我可以理解在new thing;不跟踪分配器的情况下完成工作的便利性,但是为类型层次结构的不同分支做事似乎相当复杂.

是否存在一个真实场景,派生类使用与其基础不同的分配器,并依赖虚拟析构函数来查找正确的成员operator delete

为了避免这种主观,我会接受最合理的答案.让我们不要嘲笑代码气味或"最好"的做事方式.

lea*_*der 8

我过去实际上用过这个!它对非均匀内存架构很有用 - 平台具有非常小的非常快的内存区域而没有操作系统等.

具体而言,设想例如具有少量TCM的ARM芯片(紧密耦合的存储器;基本上,嵌入在SoC上的SRAM,具有例如1个周期的访问时间).

然后我们在产品开发的最后阶段使用分析器结果 - 就在发货之前(例如,想象这是一个流行的手持游戏系统的盒式磁带) - 确定某些类将从这个更快的SRAM中受益.

一个简单的成员operator new利用这个TCM来实现派生类现在可能有意义:我们不能使用这个SRAM来拥有整个类层次结构,但对于某些低实例化计数但使用频繁的派生类,它变为简单有效的优化.通过这种方式重定向某些分配,我们在少数情况下得到了2%-10%或更多的帧时间.


小智 5

我实际上从未在派生类中使用过new/delete重载,或者我曾经想过它,但这个问题很有意思,我决定进行一些研究并试一试.我找到了几个合适的参考文献:

ARM http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka14267.html

这个引用实际上有一个派生类的示例代码,它重载了它的基类重载new.

范德比尔特大学 http://www.vuse.vanderbilt.edu/~adamsja/Courses/CS251/Projects/4/memPool.pdf

这个引用没有明确提供有关在派生类中重载new的任何材料,但是,它提到了一些有趣的原因,为什么要重载new.原因包括:

  • 补偿默认分配器中的次优对齐
  • 将相关对象聚类在一起
  • 获取非常规行为,例如用零覆盖内存以增加应用程序数据的安全性

现在基于这两个引用,我已经确定在派生类中重载new/delete可能有一些原因.我的理由基本上与我在VU演示文稿中列出的原因相一致,但基于ARM参考意味着我是嵌入式或专用场景,这似乎也是相关的.

  • 嵌入式系统通常在硬件级别上非常自定义,但是在软件级别的标准化意义上是常见的.我可以看到一种情况,根据配置设置/硬件带,在运行时选择某种类型的对象(派生类),因为它需要以特定方式或特定位置分配内存.
  • 聚类似乎是合理的,因为我可以设想一个场景,其中某些对象在高级"工作流程"中被视为相同但在处理时,这些对象的不同类型的处理方式截然不同.为了进程密集型任务(即搜索,排序,优先排序等),将特定类型的对象定位在彼此附近可能是有益的.
  • 最后一点很有意思,因为我可以看到某些情况,其中分配取决于所存储信息的安全性分类.

再一次,我没有找到理由或实际上实现了你提到过的东西,但这些是我的想法,稍作调查.