c++ - 在 C++ 中,嵌套 vector 消耗大量内存

标签 c++ vector nested memory-consumption

我试图找出为什么我的应用程序消耗太多内存。这是:

#include <iostream>
#include <sstream>
#include <string>
#include <exception>
#include <algorithm>
#include <vector>
#include <utility>
#include <assert.h>
#include <limits.h>
#include <time.h>
#include <tchar.h>
#include <random>

typedef unsigned __int32 uint;

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    vector<vector<uint>> arr(65536 * 16, vector<uint>());
    mt19937 mt;
    mt.seed(time(NULL));
    uniform_int<uint> generator(0, arr.size() - 1);
    for (uint i = 0; i < 10000000; i++)
    {
        for (uint j = 0; j < 16; j++)
        {
            uint bucketIndex = generator(mt);
            arr[bucketIndex].push_back(i);
        }
    }

    uint cap = 0;
    for (uint i = 0; i < arr.size(); i++)
    {
        cap += sizeof(uint) * arr[i].capacity() + sizeof(arr[i]);
    }
    cap += sizeof(vector<uint>) * arr.capacity() + sizeof(vector<vector<uint>>);
    cout << "Total bytes: " << cap << endl;
    cout << "Press any key..." << endl;
    cin.get();
}

我使用 Windows 7 64 位和 Visual Studio 2010,代码也编译为 64 位。

代码在调试和发布中输出以下内容

总字节数:914591424

看起来正确(您可以手动检查),但内存管理器显示应用程序消耗 ~ 1.4 GB RAM

这 500 兆字节是从哪里来的?您能给我一个如何解决这个问题的想法吗?

更新

问题是由内存碎片引起的。可以通过时不时的压缩内存来解决。

最佳答案

这是因为每个 vector 都包含三个指针(或它们的道德和大小等价物):begin、begin + size 和 begin +capacity。因此,当您有一个包含大量其他小 vector 的 vector 时,每个内部 vector 都会浪费三个字(因此在 64 位系统上为 24 个字节)。

由于每个内部 vector 的 begin() 都指向单独的分配,因此您需要支付 N 倍的分配开销。这可能是另外几个字节。

相反,您可能希望分配一个大区域并将其视为二维数组。或者使用提供此类功能的众多库之一。如果你的内部 vector 具有不同的大小,那么这将不起作用,但通常它们都是一种大小,所以无论如何你确实需要一个 2D“矩形”,而不是 vector 的 vector 。

关于c++ - 在 C++ 中,嵌套 vector 消耗大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590580/

相关文章:

c++ - 如何测试字符串是否包含表情符号?

c++ - 以线程为成员变量的类的移动操作

javascript - 如何从表示嵌套树的物化路径数组遍历并渲染嵌套 HTML?

json - 我可以将嵌套的 json 解码为平面结构吗

c++ - 该代码在 Dev-C++ 中没有给我任何输出

c++ - 从数组构造 vector

c++ - 使用给定的行 vector 和查找以最大形式排列的二进制矩阵的列 vector 和

r - R 中的选择性替换字符串

python - 外部函数中的嵌套函数更改变量不起作用

c++ - 转换 gsl 线性代数以在 scalapack 或其他并行矩阵库中使用