如何在C++;而不是使用新的? 一个C++,我被要求看的是性能不佳,因为我们在一个XML DOM树中存储关于一个节点的信息的对象上的“新”的调用太多。我已经用AQTime和非常困倦的分析器验证了原因是新的

如何在C++;而不是使用新的? 一个C++,我被要求看的是性能不佳,因为我们在一个XML DOM树中存储关于一个节点的信息的对象上的“新”的调用太多。我已经用AQTime和非常困倦的分析器验证了原因是新的,c++,xml,new-operator,xerces-c,C++,Xml,New Operator,Xerces C,这些对象都包含几个其他对象类型和指向对象作为成员的指针,因此节点对象上的每个新对象也将调用所有成员对象的构造函数,我猜这就是每次分配花费这么长时间的原因。这也意味着我们不能仅仅调用GlobalAlloc之类的东西,然后请求一大块内存——它需要在之后初始化 我一直在研究使用预分配技术来缓解这种糟糕的性能,但我看到的方法涉及请求大量未初始化的内存,这些内存不适合我所需要的,而其他方法最终都会调用new,取消了我们可能观察到的任何性能提升,所以我想知道是否还有另一个我不知道的选项?我有一种感觉,我所要

这些对象都包含几个其他对象类型和指向对象作为成员的指针,因此节点对象上的每个新对象也将调用所有成员对象的构造函数,我猜这就是每次分配花费这么长时间的原因。这也意味着我们不能仅仅调用GlobalAlloc之类的东西,然后请求一大块内存——它需要在之后初始化

我一直在研究使用预分配技术来缓解这种糟糕的性能,但我看到的方法涉及请求大量未初始化的内存,这些内存不适合我所需要的,而其他方法最终都会调用new,取消了我们可能观察到的任何性能提升,所以我想知道是否还有另一个我不知道的选项?我有一种感觉,我所要求的是无法实现的,要么快速检索未初始化的内存,要么缓慢初始化内存。请证明我错了:)


谢谢

您无法绕过初始化,所以为什么不分配一大块并构建一个自定义分配器呢?这就是你所能做的。两个问题:1。说到“缓慢初始化内存”,内存在任何情况下都不必在使用前进行初始化吗?2.考虑到分配会减慢执行速度的对象,这些对象中的所有或大部分大小是否相同?换言之,不管你考虑速度,你是否可以方便地将它们分配到一个数组中,如果你想要的话,如果有一种更快的分配对象的方法,不管成本还是折衷,那么你的C++实现可能已经使用它了。您的问题并没有描述为更快的对象初始化性能所能付出的任何代价。那么你认为改进可能来自哪里呢?也许你需要创建更少的对象。“指向对象的指针”的初始化几乎不需要任何成本,但是如果您要分配一些东西到这些指针的末尾,可能会被指向的类型的成员所取代。这个问题太笼统了。给我们一些代码示例。@SteveJessop创建更少的对象也是我正在研究的。我们的XML解析过程非常复杂,因为我们使用Xerces-C解析文档,然后递归遍历Xerces创建的DOM树,对于遇到的每个节点,我们分配一个自己的对象,其中包含该节点的本地化特定信息,然后我们使用setUserData函数将其绑定到Xerces为每个元素创建的DOMNode对象。对于6000个元素的XML文档,完成此过程需要45秒。5-10秒是我们的目标。