Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt堆碎片-QoObject可以放在内存池中吗?_C++_Qt_Memory Management - Fatal编程技术网

C++ Qt堆碎片-QoObject可以放在内存池中吗?

C++ Qt堆碎片-QoObject可以放在内存池中吗?,c++,qt,memory-management,C++,Qt,Memory Management,我有一个Qt应用程序,在这个应用程序中,列表中的大量QObjects会随着列表的更新而频繁地分配和删除 随着时间的推移,堆会变得严重碎片化,内存使用量也会增加 我通常会创建一个对象池,在其中它们被连续地分配到一个大的块中,但是这在QObject中是不可能的 每个QObject必须单独分配,这对性能是个问题。更糟糕的是,有一个对象层次结构,所以父母删除他们的孩子,而我无权访问删除调用,所以我不能只写MyPool->Free(obj) 除非我重载新的和删除操作符?这不会有多大帮助。为了保持二进制兼容

我有一个Qt应用程序,在这个应用程序中,列表中的大量
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。