【发布时间】:2013-08-20 13:29:03
【问题描述】:
我正在尝试估计一个向量在内存中的大小,但似乎我没有得到正确的近似值。
这是我写的检查的小代码:
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
size_t n = 100;
size_t m = 1000000;
float sizeInKB = (sizeof(vector<vector<int> >) + n*sizeof(vector<int>) + n*m*sizeof(int))/1024.0f;
cout << sizeInKB << " KB" << endl;
vector<vector<int> > vect(n);
for(int i = 0; i < n; ++i)
{
vect[i].resize(m);
}
while(true)
{}
return EXIT_SUCCESS;
}
作为输出,我得到 390 630 KB,而根据任务管理器,应用程序占用了 394 588 KB 的内存。我同意这不是了解应用程序(尤其是向量)使用了多少内存的最佳方法,但它提供了一个很好的提示,而且 4 MB 不仅仅是几 KB。
现在,如果我尝试估计一个向量的向量在内存中的大小,它会变得越来越混乱。使用相同的代码,将 int 替换为 vector<int> :
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
size_t n = 100;
size_t m = 1000000;
float sizeInKB = (sizeof(vector<vector<vector<int> > >) + n*sizeof(vector<vector<int> >) + n*m*sizeof(vector<int>))/1024.0f;
cout << sizeInKB << " KB" << endl;
vector<vector<vector<int> > > vect(n);
for(int i = 0; i < n; ++i)
{
vect[i].resize(m);
}
while(true)
{}
return EXIT_SUCCESS;
}
作为输出,我得到 4 687 500 KB,而根据任务管理器,应用程序占用了 6 271 028 KB 的内存。有超过 1.5 GB 的差异......这个开销来自哪里?有没有办法计算它?
我在 Windows 7 Pro 64 位和 Visual Studio 2008 上运行所有这些...
提前致谢,
【问题讨论】:
-
请记住,操作系统也需要空间来进行内务处理、页表、内存映射、堆栈等。
-
在调试版本中更是如此,您应该比较调试和发布结果。
-
看起来您缺少第二个代码中整数存储的大小。
-
@tinman:但是每个内部向量(第三维)都包含零个元素。