Qt堆碎片化 - 能否将QObjects置于内存池中?

4
我有一个Qt应用程序,在更新列表时经常需要分配和删除大量。随着时间的推移,堆变得严重碎片化,内存使用量增加。通常情况下,我会创建一个对象池,其中它们在大块中连续地分配,但这对于QObject来说是不可能的。每个QObject必须单独分配,这对性能来说是个问题。更糟糕的是,有一个对象层次结构,因此父项删除其子项,而我无法访问删除调用,所以我不能只写MyPool->Free(obj);除非我重载new和delete运算符?

1
你有多确定 QObject 的删除是导致显著内存碎片化的原因?正常的内存管理在避免这种类型的碎片化方面表现得相当不错。只有在普通对象的分配和释放模式出现相当奇怪的模式时,才会导致严重的碎片化。然后,要更好地使用池,需要对释放模式有非常好的理解。但是,如果你认为你可以通过池做得更好,那么显然可以重载 newdelete - JSF
2个回答

1

这并没有太大帮助。为了保持二进制兼容性,QObject 使用了 PIMPL 惯用法。一个 QObject 看起来就像这样:

class QObject {
    QObjectData *d;
};

sizeof(QObject) == sizeof(void *)。d指针的实际分配具有“合理”的大小(并将触发进一步的分配),除非您愿意进行大规模的黑客攻击,否则几乎完全不受您的控制...


为什么不能重载 QObjectDatanewdelete - JSF
这是“大规模黑客攻击”的一部分。需要修改Qt。 - peppe

0
基本上,如果您有需要使用池架构的情况,就不应该使用Qt的层次结构。使用适当的、有效的容器。 如果您需要管理Qt对象,那么请将您分配的池和结构与您需要处理的预分配池中的对象相匹配。 更让人难以忍受的是,在某些情况下,QT没有我们的知识将对象复制到其容器内部,而在其他情况下,它仅存储指针。我会说,Qt不是一个内存管理友好的框架。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接