【问题标题】:how to figure out the amount of memory a 2D vector is taking currently in C++如何计算 2D 向量当前在 C++ 中占用的内存量
【发布时间】:2021-07-09 03:52:02
【问题描述】:

我有一个二维向量vector<vector<int>> data。我想知道一段时间后它占用的总内存。我可以遍历向量并添加每个内部向量的大小,但有更好的方法吗?

跟进:如果我有vector<string> data。有没有办法在不遍历向量的情况下获得一段时间后占用的内存?

【问题讨论】:

  • 粗略的想法:将所有length 值相加并乘以sizeof(int)
  • 您是否使用过任何内存分析工具?
  • 你真的想知道内存的使用量,还是只知道元素的总数?如果是实际记忆,为什么需要知道这一点?应该解决什么问题?
  • 顺便说一下,即使你计算了所有元素和所有对象的大小,它仍然不是使用的真实大小,因为分配器本身可能已经为每个元素添加了一些内部元信息分配。出于对齐原因,也可能存在填充。并且操作系统本身通常将 pages 分配给进程而不是单个字节。

标签: c++ string memory vector


【解决方案1】:

如果您使用vector 类,则必须进行迭代。或者也许有一些函数可以用一些神奇的语法来做到这一点,但仍然会有一个迭代在幕后进行。

因此,如果您想避免迭代,那么您可能必须编写一个支持您想要的新容器类。或者至少是一些包装类。

在实践中,我看到了两种可能的计算大小的方法:

  1. 像现在这样迭代每个元素
  2. 每次添加或删除元素时重新计算大小

这里有一个(不完整的)例子来说明这个想法:

class MyContainer   {
private:
    std::vector<std::vector<int>> data;
    int total_size;

public:
    void push_back(int pos, int val) {
        data[pos].push_back(val);
        total_size++;
    }

    int size() {
        return total_size;
    }
};

请记住,这将跟踪元素的数量。如果将它们乘以sizeof (int),您将获得内存使用量的近似值。但它不包括存储东西的开销。一个更大的因素是,像 vector 这样的类通常会保留比所需更多的内存,以避免每次添加新元素时都必须分配。

因此,如果您想使用 vector 类,您可以通过迭代 capacity 而不是 size 来获得更好的内存使用近似值。但是你又回到了迭代。因为您不能像使用push_back 那样简单地挂钩分配。但这是可能的。这是一个粗略的想法:

class MyContainer   {
private:
    std::vector<std::vector<int>> data;
    std::vector<int> capacity;
    int total_capacity;

public:
    void push_back(int pos, int val) {
        data[pos].push_back(val);
        total_capacity += data[pos].capacity - capacity[pos];
        capacity[pos] = data[pos].capacity;
    }

    int capacity() {
        return total_capacity;
    }
};

这不会占用MyContainer::capacity 的额外大小,但您可以修改代码来解决这个问题。

【讨论】:

  • 仅添加元素大小不会计算容器的实际内存消耗。您必须考虑向量本身的管理变量、保留的内存容量,以及由于对齐和其他重构而产生的开销分配,您必须了解实际的 OS 和 MM 系统。
  • @πάνταῥεῖ 我正在写关于那个 atm 的文章
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2017-03-08
相关资源
最近更新 更多