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

标签 c++ qt memory-management

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

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

我通常会创建一个对象池,在其中将它们连续分配到一个大块中,但是这对于 QObject 是不可能的。

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

除非我重载 newdelete 运算符?

最佳答案

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

class QObject {
    QObjectData *d;
};

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

关于c++ - Qt 堆碎片 - QObjects 可以放在内存池中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34313887/

相关文章:

memory-management - 将引用转换回闭包内的强引用,内存管理,swift

objective-c - UITableViewCell 内存管理

c++ - 如何通过信号和槽发送数据?

linux - 共享内存的页面缓存

c++ - 在 MSVC 2010 中编译 64 位应用程序

c# - 创建 C# 绑定(bind)

c++ - Visual Studio 2019 中的修改和静态/动态绑定(bind)

c++ - 用于比较 (_mm_cmpeq_ps) 和赋值操作的 SSE 内在函数

c++ - cLion + Qt5 - 退出代码 -1073741515 (0xC0000135)

c++ - 如何获取QTreeView中没有出现的文件