获取Qt对象的大小

时间:2009-08-13 19:16:40

标签: c++ qt

我正在使用Qt和C ++,我需要找出某些Qt类实例使用的内存量,这通常使用sizeof来完成,但是在Qt中每个类都包含一个指向包含实际的另一个类的指针实现时,在头文件中找不到此私有实现类的定义,但仅在源代码中找到。

我是QT的新手所以可能有一种标准的方法可以做到这一点,如果没有任何想法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:10)

在标准C ++中无法做到这一点,很少有框架支持类似的东西。原因很简单 - 正如您所观察到的,对象可能包含指针,而这些指针可能指向包含指针的其他对象, 等等。即使你到达指针链的末尾,也没有通用的方法来找出指针指向的内存量。

所以,你需要找到另一种方法来解决你的问题,我认为这不是首先要解决的问题。

答案 1 :(得分:7)

这个问题没有确切的答案,因为为同一类型的不同对象分配的内存量可能甚至不相同(例如,QSomething A可能能够重用缓存中的某些数据,而QSomething B可能必须单独分配等)。

我想你可以做的是编写一个简单的测试程序,启动它,分配有问题的对象的N,然后进入sleep()很长一段时间。当程序正在休眠时,使用任务管理器(或您喜欢的任何工具)来查看进程使用多少RAM。然后ctrl-C(或杀死)该过程,并使用较大的N值再次运行它,并重复测量。重复这个过程,最终你会了解进程的RAM分配如何随着分配的项目数量的增长而增长,然后你可以做一个小代数来得到每个对象的平均内存成本的概念。

(请记住,在启动过程中会有很多内存开销,因此从所有情况中减去N = 0情况所使用的内存,这样您只需测量对象的成本而不是环境开销)

答案 2 :(得分:5)

事实上,问题不是Qt独有的。考虑std::string使用多少空间。它既不是sizeof(std::string)也不是std::string::size()

C ++没有这个问题的答案,因为这个问题很少有意义。

答案 3 :(得分:3)

我发现通常QObject对于创建超过几千个实例来说相当沉重。

正如其他几个人所提到的,通常最好的解决方法是尝试并看看会发生什么。你甚至可以写一个像这样的小应用程序:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QObject objects[5000];
    return app.exec();
}

然后在退出应用程序之前测量内存使用情况。