C++中计算类的单个示例的总内存使用量

mkh04yzy  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(101)

我有一个复杂的类,有很多其他类的向量和指针。我如何计算这个类在示例化后消耗了多少内存,包括它所有的内部内存分配?我用的是C++、Qt和Win10。

class foo: public fooparent
{
public:
    foo();

    std::vector<foo2 *>  layers;
    foo3 *worker;
    std::string meta_data;
    int model_loaded;
};

解决方案1:一种解决方案是在示例化之前和之后测量应用程序的总内存消耗,但是否有更好的方法?

3okqufwl

3okqufwl1#

没有比测量更好的方法了。
让我们简化这个例子:

struct foo_simple {
    std::vector<foo_simple*>  layers;
};

一个示例的内存消耗量是多少?通常你关心的是sizeof(foo_simple),它是成员的大小加上填充。如果您关心成员以及成员指向的示例所消耗的总内存,那么您就不走运了。foo_simple可以这样使用:

foo_simple fs;
 for (int i=0;i < 100000; ++i) fs.push_back(new foo_simple);

在这种情况下,指针是拥有指针的指针(首先不应该是原始指针,但这超出了这个问题的范围),fs“消耗”的内存大约是(100000 + 1) * sizeof(foo_simple)
现在考虑这个不同的用法:

foo_simple a;
 foo_simple b;
 for (int i=0;i < 100000; ++i) a.push_back(&b);

现在a拥有一个有100000个指针的向量,但总共只有2个示例。创建另一个a不一定会创建另一个b
您无法知道类的一个示例总共消耗了多少内存。特别是当涉及原始指针时,你想把剩下的代码当作“黑盒”,那么(不幸的是)你不能知道这些指针是否拥有,是否应该添加指针的内存占用。请注意,std::shared_ptr也不足以带来清晰度,因为两个std::shared_ptr可以共享同一个示例。只有使用std::unique_ptr,您才能确定内存占用量,尽管您还需要考虑std::unique_ptr是否实际用于拥有资源。
TL;DR:您可以通过编写一个小程序来测量它,该程序分配10/100/1000/100000个示例,并使用系统内存管理器来估计单个示例的内存消耗。考虑到你的限制(你没有显示的代码是“黑盒”),这是最好的方法。

相关问题