我试图找出为什么我的应用程序消耗太多内存。这是:
#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/