c++ - 准确计算 C++ 程序使用的内存

标签 c++ memory sizeof

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

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

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

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

最佳答案

Is there something wrong with the way I'm calculating the memory used?

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

此外,请记住,您正在使用的任何库(例如操作系统 API)都会分配内存,而这些东西并不是免费的。

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

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

关于c++ - 准确计算 C++ 程序使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832521/

相关文章:

c++ - 我可以在 C 和 C++ 中可靠地将函数指针设置为 NULL 吗?

performance - 读取/索引大索引时出现 SOLR 内存不足错误

c++ - STL 不从系统级别释放内存

c - 为什么 C99 标准的作者不指定浮点类型大小的标准?

c++ - 内部类访问外部类私有(private)成员数据

c++ - 寻找 OpenGL 齿轮示例的 C++ 实现

C++11 'native_handle' 不是 'std::this_thread' 的成员

c - 函数返回后本地内存地址是否有效?

C++ 数组大小

c - 我如何计算没有。字符串数组中的字符串?