【问题标题】:Is there a way to print the amount of heap memory an object has allocated?有没有办法打印对象分配的堆内存量?
【发布时间】:2016-07-07 20:46:43
【问题描述】:

在正在运行的程序中,如何跟踪/打印对象已分配的堆内存量?

例如:

#include <iostream>
#include <vector>

int main(){

  std::vector<int> v;

  std::cout << heap_sizeof(v) << '\n';

  for (int i = 0; i < 1000; ++i){
    v.push_back(0);
  }

  std::cout << heap_sizeof(v) << '\n';
}

是否有可以替代heap_sizeof() 的实现?

【问题讨论】:

  • 一般情况下,仅针对特定平台。它与堆的实现密切相关。
  • shared_ptr应该计入谁?
  • std::cout &lt;&lt; sizeof(int) * v.capacity() &lt;&lt; endl;
  • vector 可能不是最好的例子。我一直在寻找可以在自定义类型上工作的东西。
  • @TrevorHickey,见这里:stackoverflow.com/questions/949422/…

标签: c++ memory-management heap-memory allocation


【解决方案1】:

所有东西都是开箱即用的,不,这是不可能的。不过,您确实有几个选项可以自行完成。

如果您需要专门用于标准容器,您可以实现一个分配器来跟踪通过该分配器分配(而不是释放)的内存。

如果您希望通过new(无论是否为容器)分配的所有内容都具有此功能,您可以在全局和/或特定类的基础上提供您自己的operator new 实现,并拥有它(例如)从指向块大小的指针构建一个无序映射,以告诉您它分配的任何块的大小(并且您必须提供一个函数来检索该大小)。根据平台的不同,这也可以使用特定于平台的功能来实现。例如,当您为 Microsoft 的编译器(实际上是库)构建时,operator new 的实现根本不需要做任何特别的事情,检索块大小的函数看起来像这样:

size_t block_size(void const *block) { 
    return _msize(block);
}

另一种可能性是将每个请求块的分配大小增加一个足以容纳该大小的整数大小。在这种情况下,您将分配比用户请求更大的数据块,并将该块的大小存储在返回的块的开头。当用户请求块的大小时,您从他们传递的指针中获取正确的(负)偏移量,并返回您存储在那里的值。

【讨论】:

    【解决方案2】:

    首先,v 分配在栈上,而不是堆上。

    要获取它使用的总空间量,我建议使用这个函数:(找到on this article,并稍作修改)

    template <typename T>
    size_t areaof (const vector<T>& x)
    {
       return sizeof (vector<T>) + x.capacity () * sizeof (T);
    } 
    

    如果你不想计算std::vector对象本身的大小,删除带有sizeof的部分:

    template <typename T>
    size_t heap_sizeof (const vector<T>& x)
    {
       return x.capacity () * sizeof (T);
    } 
    

    【讨论】:

    • v 可能在堆栈上,但它的内容在堆上。
    • 当然可以。我只是想指出 v 在堆栈上(在他的示例中)。
    • 好的。明白了。澄清。
    • 也许没有堆栈或堆。 C++ 让您的选择保持开放。
    • 是的。我发布的功能是针对他的示例的。
    【解决方案3】:

    如果您不关心每个对象分配的内容,而更关心在时间点之间分配/释放了多少内存,您可以使用 malloc 统计功能。每个 malloc 都有自己的版本。在linux上你可以使用mallocinfo()

    【讨论】:

      猜你喜欢
      • 2019-04-04
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2014-04-21
      • 2016-05-31
      • 2013-07-01
      • 2011-12-29
      相关资源
      最近更新 更多