矢量c ++矢量的大小

时间:2013-08-20 13:29:04

标签: c++ memory vector sizeof

我正在尝试估计矢量矢量的内存大小,但似乎我没有得到正确的近似值。

以下是我编写的用于检查的小代码:

#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运行所有这些...

提前致谢,

1 个答案:

答案 0 :(得分:3)

在第二种情况下,n * m个元素中的每一个都是vector<int>,必须动态分配。每个这样的动态分配都有开销。找到具有32-64字节开销的动态分配并不罕见。这很可能是您“丢失”字节的部分原因。