准确计算C ++编程使用的内存

时间:2012-12-12 03:57:44

标签: c++ memory sizeof

我正在为工作而写的程序需要跟踪自己使用的内存。但是它无法监视整个内存的使用情况,我需要它来监视程序中的每个对象以及该对象使用了多少内存,这样它就可以告诉该对象如果使用上面的内容,则会减少内存使用量一定的能力。监视内存使用情况的部分包含指向所有已创建对象的指针,并通过调用返回该对象大小的该对象上的方法来跟踪其内存使用情况。

我遇到的问题是我无法准确计算所用内存的大小。如果我的计算有点偏差并不重要,但我会有很大的不同。我的程序计算的大小在程序的实际内存使用量的1/2到2/3之间变化(取决于程序执行的操作)。例如,使用3.35gb ram的程序计算仅使用2.16gb。

我计算对象大小的当前方法是将sizeof(* this)添加到对象中任何向量或数组的长度乘以向量/数组中元素的大小。

我计算使用的内存的方式有问题吗?或者还有其他我没有考虑到的东西?如果有人知道一个程序,你可以通过程序的不同方面分析内存使用情况,这也是非常有用的,这样我就可以追踪所有这些额外内存的来源(最好是可以在没有GUI的Linux上运行的程序)我正在使用Ubuntu服务器,但也有一台我可以使用的Windows机器。)

1 个答案:

答案 0 :(得分:2)

  

我计算使用的内存的方式有问题吗?

是。首先,程序消耗的内存大小可能无法在任何一点上完全使用。例如,在向量调整大小之后,可以将旧存储器块返回到系统。或者它可能会被堆保留,以便下次有人请求相同大小的内存块。

另外,请记住,您使用的任何库(例如OS API)都会分配内存,而且这些库不是免费的。

还要记住,堆管理器为每个内存分配施加了额外的开销;每次分配通常按指针或两个指针的顺序。

如果要跟踪应用程序中使用内存的内容,请使用真实的内存分析器。如果要动态调整程序首先分配的内存量,请使用分析器计算出您正在处理的某个对象所占用的平均大小,然后根据对象数而不是内存大小进行限制。