【发布时间】:2014-03-23 11:58:13
【问题描述】:
我试图弄清楚为什么我的应用程序消耗了太多内存。这里是:
#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 兆字节是从哪里来的?你能告诉我如何解决这个问题吗?
更新
问题是由内存碎片引起的。可以通过不时压缩内存来解决。
【问题讨论】:
-
不幸的是,我没有在那里找到我的问题的答案。
-
@tinnulion 我认为您需要仔细观察。另外,看看保留集(虚拟内存很有趣)。
-
对不起,我没明白。能不能详细解释一下?
-
您的代码几乎无法编译。它缺少标题并使用不存在的类。它使用非便携式主机。它缺少使用命名空间来使其工作。基本上,“wat”。
-
@sehe 这会使内存碎片化。根据分配器的不同,它可能会将您的块之间的间隙显示为空闲,但孔通常只是“廉价”内存,不能用于更大的分配,并且将您以后的分配填充到彼此相距很远的间隙中,通常会导致很多缓存未命中通过搞砸地方。如果谈到高效的内存使用,那么紧凑的结构和内存池是赢家。
标签: c++ vector nested memory-consumption