【问题标题】:How to keep track of the allocated memory of a list of lists?如何跟踪列表列表的分配内存?
【发布时间】:2017-09-13 11:27:00
【问题描述】:

我正在尝试找出列表列表正在使用多少内存(以字节为单位)。

这里说明了问题:

它显示了一个容器列表,其中存储指向其他列表(存储列表)的指针,每个列表都存储统一大小的元素(假设每个 10 字节)。所以第一个存储列表存储 4 个元素,接下来是 30 个,然后是下一个 12 和 10,最后一个是 5 个元素。所有元素都属于相同的 C++ 类型(只是普通旧数据的结构)。

我的目标: 上面的 Container List 应该有 current size 变量,它跟踪他指向的列表的字节数(所有跟踪的空间都用于 *prev 和 *next 指针)。

到目前为止,我尝试的是使用分配器来跟踪列表分配的字节数(通过静态类变量)。虽然这会导致 std::list::splice 出现问题,但当从列表 see here 移动元素时:不会跟踪拼接到另一个容器列表的元素。它甚至应该能够跟踪传输的字节数,以将该字节数添加到另一个容器列表的当前大小。

  • 我是否必须避免使用 STD 分配器进行内存跟踪和 而是以某种方式使用 boost 的侵入式列表来跟踪内存,例如 那个?

  • 通过解决我的问题可能支持哪种 C++ 功能
    有问题吗?

【问题讨论】:

  • 恕我直言std::allocator 是选择。您认为您的实施存在哪些问题?
  • 这可能更适合Computer Science
  • @KavehVahedipour 我的解决方案中 std::allocator 的问题在于能够跟踪所有容器列表使用的内存总量。如果我将使用两个不同的分配器来分隔跟踪的内存计数器,我将无法使用 std::list::splice 因为这需要使用相同的分配器。即使有可能,传输也不会跟踪字节,因为只是重新排列了指针(不调用 std::allocator 的分配)。
  • 这听起来像原始的 C++98 问题 - 列表不能同时具有 O(1) 大小和 O(1) 拼接。你必须选择,因为必须有人计算。需要值的时候不能不计算字节数吗?
  • "我真的没有与这些 std::lists 关联的字节数" 您不需要存储在任何地方的字节数,您可以根据大小计算它。您应该知道一个空列表和一个包含 1 个元素的列表需要多少字节。它应该线性缩放。对于给定的元素类型,这些大小几乎是恒定的,因此您可以通过使用自定义分配器运行一个小型测试程序来发现它们。

标签: c++ memory-management boost allocator


【解决方案1】:

我发现您可以使用 EASTL 分配器,因为它们绑定在每个列表对象上。

所以在 EASTL::CustomAllocator::allocate 和 EASTL::CustomAllocator::deallocate 上,您可以通知主列表子列表(此处:存储列表)的分配字节已更改其权重(此处:大小存储列表分配的字节数)。

这样主列表(这里:容器列表)总是得到一个更新的权重,它被缓存并绑定到主列表。

对于应该通知主列表的 CustomAllocator,请参阅我的回答:

How to track memory usage using EASTL?

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2012-12-16
    • 1970-01-01
    • 2021-08-19
    • 2019-05-03
    相关资源
    最近更新 更多