我有一个复杂的类,有很多其他类的向量和指针。我如何计算这个类在示例化后消耗了多少内存,包括它所有的内部内存分配?我用的是C++、Qt和Win10。
class foo: public fooparent
{
public:
foo();
std::vector<foo2 *> layers;
foo3 *worker;
std::string meta_data;
int model_loaded;
};
解决方案1:一种解决方案是在示例化之前和之后测量应用程序的总内存消耗,但是否有更好的方法?
1条答案
按热度按时间3okqufwl1#
没有比测量更好的方法了。
让我们简化这个例子:
一个示例的内存消耗量是多少?通常你关心的是
sizeof(foo_simple)
,它是成员的大小加上填充。如果您关心成员以及成员指向的示例所消耗的总内存,那么您就不走运了。foo_simple
可以这样使用:在这种情况下,指针是拥有指针的指针(首先不应该是原始指针,但这超出了这个问题的范围),
fs
“消耗”的内存大约是(100000 + 1) * sizeof(foo_simple)
。现在考虑这个不同的用法:
现在
a
拥有一个有100000个指针的向量,但总共只有2个示例。创建另一个a
不一定会创建另一个b
。您无法知道类的一个示例总共消耗了多少内存。特别是当涉及原始指针时,你想把剩下的代码当作“黑盒”,那么(不幸的是)你不能知道这些指针是否拥有,是否应该添加指针的内存占用。请注意,
std::shared_ptr
也不足以带来清晰度,因为两个std::shared_ptr
可以共享同一个示例。只有使用std::unique_ptr
,您才能确定内存占用量,尽管您还需要考虑std::unique_ptr
是否实际用于拥有资源。TL;DR:您可以通过编写一个小程序来测量它,该程序分配10/100/1000/100000个示例,并使用系统内存管理器来估计单个示例的内存消耗。考虑到你的限制(你没有显示的代码是“黑盒”),这是最好的方法。