计算c++中类的单个实例的总内存使用量

问题描述 投票:0回答:1

我有一个复杂的类,其中包含许多其他类的向量和指针。如何计算该类实例化后消耗的内存使用量(包括其所有内部内存分配)? 我用的是c++、Qt、win10。

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

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

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

c++ memory memory-management
1个回答
0
投票

不,没有比测量更好的方法了。

让我们简化一下示例:

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 个实例的小程序来测量它,并使用系统内存管理器来估计单个实例的内存消耗。考虑到您的限制(您没有显示的代码是“黑匣子”),这是最好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.