Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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对象的大小_C++_Qt - Fatal编程技术网

C++ 获取Qt对象的大小

C++ 获取Qt对象的大小,c++,qt,C++,Qt,我使用Qt和C++,我需要找出某些QT类的实例所使用的内存量,这通常是用sieof来完成的,但是在Qt中,每个类都持有指向包含实际实现的另一个类的指针,这个私有实现类的定义在头文件中没有找到,而仅在源代码中找到。 我对QT是新的,所以可能有一个标准的方法来做这件事,如果你没有任何解决的办法? < P>在标准C++中没有办法做到这一点,而且很少有框架支持它的任何东西。原因很简单-正如您所观察到的,一个对象可能包含指针,这些指针可能指向包含指针的其他对象, 等等即使到了指针链的末尾,也没有通用的方法

我使用Qt和C++,我需要找出某些QT类的实例所使用的内存量,这通常是用sieof来完成的,但是在Qt中,每个类都持有指向包含实际实现的另一个类的指针,这个私有实现类的定义在头文件中没有找到,而仅在源代码中找到。
<>我对QT是新的,所以可能有一个标准的方法来做这件事,如果你没有任何解决的办法?

< P>在标准C++中没有办法做到这一点,而且很少有框架支持它的任何东西。原因很简单-正如您所观察到的,一个对象可能包含指针,这些指针可能指向包含指针的其他对象, 等等即使到了指针链的末尾,也没有通用的方法来确定指针指向多少内存


因此,您需要找到另一种方法来解决您的问题,我认为首先解决这个问题是不对的。

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

我想,您可以编写一个简单的测试程序,启动该程序,分配N个相关对象,然后长时间进入sleep()。当程序处于睡眠状态时,使用任务管理器(或任何您喜欢的工具)查看进程使用了多少RAM。然后使用ctrl-C(或kill)重复这个过程,最终你会知道进程的RAM分配是如何随着分配的项目数量而增长的,然后你可以做一点代数来大致了解每个对象的平均内存成本


(请记住,在启动过程中会有大量内存开销,因此从所有情况中减去N=0情况下使用的内存,以便您只测量对象的成本,而不是环境开销)这个问题并不是Qt独有的,事实上,考虑一下<代码> STD::String 使用的空间。它既不是<代码> SIEZOF(STD::String)< /C>也不是<代码> STD::String::siz()/<代码> < /P>
C++对这个问题没有答案,因为这个问题很少有意义。

我发现,一般来说,QObject对于创建数千个以上的实例来说相当繁重

正如其他一些人所提到的,解决这个问题的最佳方法通常是尝试一下,看看会发生什么。您甚至可以编写这样的小应用程序:

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

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

为什么您认为需要这样做?我需要知道我是否可以创建数千个内存,或者对象太大。@Diaa:只需尝试创建它们,并正确检查是否有错误errors@anon有些人没有无限的记忆,实际上不得不考虑这一点,而不是写臃肿的C。ode.
QObject
添加了一些不错的特性,但如果我们使用sizeof(std::string)来嘲弄std::string的oom killer,那就不值得了+字符串长度为您提供了一个几乎正确的数字。为了能够编写高效的应用程序,您应该知道一个对象有多重。我觉得奇怪的是,在一种允许低级编程并给予您绝对控制的语言中,这样的问题很少有意义。仅举几个原因,它不那么可靠:小的字符串优化、大小取整、堆开销、COW。请记住第二句话,我还没有遇到过这样的情况,即缺少这些信息会阻碍我。@Diaa它确实给了你绝对的控制权,但如果你想这样做,你不能使用像Qt这样的库,或者说是标准库——你必须自己编写。但是事实上这些库提供了您所问的功能,应该向您表明这不是一个特别有用的功能来实现。@Neil,@MSalters谢谢您的回答,我理解您的观点,但我不相信。我想进一步讨论这一点,但注释不太适合于此。将对象放在堆栈上是非常必要的应用程序内存使用情况并不反映这一点,因为堆栈已经是预先分配的内存块。此外,这不会给出QObject的实际大小,而只是对象外壳的大小,您可以通过sizeof轻松且更准确地获得该大小。。。