我有一个复杂的类,其中包含许多其他类的向量和指针。如何计算该类实例化后消耗的内存使用量(包括其所有内部内存分配)? 我用的是c++、Qt、win10。
class foo: public fooparent
{
public:
foo();
std::vector<foo2 *> layers;
foo3 *worker;
std::string meta_data;
int model_loaded;
};
解决方案1:一种解决方案是测量实例化前后的应用程序总内存消耗,但有没有更好的方法?
不,没有比测量更好的方法了。
让我们简化一下示例:
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 个实例的小程序来测量它,并使用系统内存管理器来估计单个实例的内存消耗。考虑到您的限制(您没有显示的代码是“黑匣子”),这是最好的方法。