C++ Qt堆碎片-QoObject可以放在内存池中吗?
我有一个Qt应用程序,在这个应用程序中,列表中的大量C++ Qt堆碎片-QoObject可以放在内存池中吗?,c++,qt,memory-management,C++,Qt,Memory Management,我有一个Qt应用程序,在这个应用程序中,列表中的大量QObjects会随着列表的更新而频繁地分配和删除 随着时间的推移,堆会变得严重碎片化,内存使用量也会增加 我通常会创建一个对象池,在其中它们被连续地分配到一个大的块中,但是这在QObject中是不可能的 每个QObject必须单独分配,这对性能是个问题。更糟糕的是,有一个对象层次结构,所以父母删除他们的孩子,而我无权访问删除调用,所以我不能只写MyPool->Free(obj) 除非我重载新的和删除操作符?这不会有多大帮助。为了保持二进制兼容
QObject
s会随着列表的更新而频繁地分配和删除
随着时间的推移,堆会变得严重碎片化,内存使用量也会增加
我通常会创建一个对象池,在其中它们被连续地分配到一个大的块中,但是这在QObject
中是不可能的
每个QObject
必须单独分配,这对性能是个问题。更糟糕的是,有一个对象层次结构,所以父母删除他们的孩子,而我无权访问删除调用,所以我不能只写MyPool->Free(obj)
除非我重载
新的
和删除
操作符?这不会有多大帮助。为了保持二进制兼容性,QObject
使用PIMPL习惯用法。一个QObject
非常像这样:
class QObject {
QObjectData *d;
};
和
sizeof(QObject)==sizeof(void*)
。d指针的实际分配有一个“合理”的大小(并将触发进一步的分配),这几乎完全超出了您的控制范围,除非您愿意进行大规模的黑客攻击…如果您有需要使用池体系结构的情况,您不应该使用Qt的层次结构。使用合适、有效的容器。
如果您需要使用它来管理Qt对象,请将您在其中分配的池和结构与您需要使用的预分配对象池相匹配。
雪上加霜的是,在某些情况下,QT会在我们不知情的情况下将对象复制到容器内部,而在另一些情况下,它只存储指针。我想说,Qt不是一个内存管理友好的框架。您有多确定
QObject
删除是导致内存严重碎片的原因?正常的内存管理很好地避免了这种碎片。需要一种相当奇怪的分配和释放模式,才能导致普通对象的严重碎片化。然后需要非常好地理解释放模式,才能更好地使用池。但是,如果你认为你可以用一个池做得更好,那么显然,你不能为QObjectData
重载new
和delete
?这就是“大规模黑客”的一部分。需要修改Qt。