【问题标题】:Accurately Calculating the Memory used by a C++ Programming准确计算 C++ 编程使用的内存
【发布时间】:2012-12-12 03:57:44
【问题描述】:

我为工作编写的程序需要跟踪它自己使用的内存。但是它不能作为一个整体监控它的内存使用情况,我需要它来监控程序中的每个对象以及该对象正在使用多少内存,这样它就可以告诉该对象在上面使用时减少内存使用一定的能力。监控内存使用的部分持有一个指向所有已创建对象的指针,并通过调用该对象上返回对象大小的方法来跟踪它们的内存使用情况。

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

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

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

【问题讨论】:

  • 你在这些向量中保留了哪些对象?如果这些对象动态分配内存(使用newmalloc 等),sizeof 将不会考虑由此消耗的空间。
  • 问题可能来自您正在使用的程序告诉您已为您的应用程序分配了多少内存(而不是您的代码进行计算)。问题是该程序正在添加操作系统已分配给您的应用程序的页面总和。然后运行时使用分配的页面进行自己的内存管理(并非所有内存都可能分配给对象)。
  • 一件简单的事情:如果你的很多内存都在向量中,请记住使用它们的容量而不是它们的大小来估计实际内存“使用”(即虚拟地址的占用)而不是理论内存使用情况(实际使用的内存有用)。由于容器开销,其他容器要贵得多(通常每个元素有几个指针,当元素是像整数这样的小对象时,这会很快加起来。)
  • 在我这样计算的向量中,我只保存原始数据类型或包含原始数据类型的结构。
  • 向量没有问题(但请记住使用容量,而不是大小)。我指的是其他容器,例如 std::map,甚至是 std::list。

标签: c++ memory sizeof


【解决方案1】:

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

是的。首先,您的程序所消耗的内存大小可能不会在任何时候完全使用。例如,在向量调整大小之后,旧的内存块可能会返回给系统。或者它可能会在下次有人请求相同大小的内存块时被堆保留。

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

还请记住,堆管理器会为每个内存分配带来额外的开销;通常在每个分配的一个或两个指针的顺序上。

如果您想跟踪应用程序中的内存使用情况,请为此使用真正的内存分析器。如果您想动态扩展程序首先分配的内存量,请使用分析器来计算您正在处理的一个对象占用的平均大小,然后限制对象数量而不是内存大小。

【讨论】:

  • 我已经考虑到会有一些开销,所以没想到会得到准确的结果。但是我没有意识到内存块可以像那样保存在堆中。这很能解释为什么我的计算结果如此不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2013-09-14
  • 1970-01-01
相关资源
最近更新 更多