Qt堆碎片 - 可以将QObject放在内存池中吗?

时间:2015-12-16 13:54:12

标签: c++ qt memory-management

我有一个Qt应用程序,当列表更新时,列表中的大量QObject经常被分配和删除。

随着时间的推移,堆变得严重碎片化,内存使用量也会增加。

我通常会创建一个对象池,它们在一个大块中连续分配,但QObject无法实现。

每个QObject必须单独分配,这是性能问题。更糟糕的是,有一个对象层次结构,所以父母删除他们的孩子,我无法访问删除调用,所以我不能只写MyPool->Free(obj);

除非我重载newdelete运算符?

2 个答案:

答案 0 :(得分:1)

这不会有太大帮助。为了保持二进制兼容性,QObject使用PIMPL惯用法。 QObject非常像这样:

class QObject {
    QObjectData *d;
};

sizeof(QObject) == sizeof(void *)。 d指针的实际分配具有“合理”的大小(并将触发进一步的分配),除非你愿意做大量的黑客攻击,否则这几乎完全超出你的控制范围......

答案 1 :(得分:0)

差不多,如果你有案例,你需要使用池架构,你不应该使用Qt的层次结构。使用适当,有效的容器。 如果您需要需要来管理Qt对象,请使用您需要使用的预分配的对象池来配置您在其中分配的池和结构。 在某些情况下,如果在我们不知情的情况下QT 对象复制到其容器的内部,而在其他情况下它只存储指针。我会说,Qt不是一个对内存管理友好的框架。