向量c++的向量大小

Posted

技术标签:

【中文标题】向量c++的向量大小【英文标题】:Size of vector of vector c++ 【发布时间】: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&lt;int&gt;

#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:但是每个内部向量(第三维)都包含零个元素。 【参考方案1】:

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

【讨论】:

但即使在第一种情况下,如果我采用size_t m = 50000000,则预期大小为 19.531 GB,使用的内存为 19.572 GB ... 那么操作系统的内务管理呢? 在第一种情况下,您有 100 个 m 的向量 int 的向量。为此只有 100 个向量开销,每个包含 1M 个整数。在第二种情况下,您有 1 亿个 int 向量,每个向量都有自己的 int 存储空间。在不知道vector&lt;int&gt; 的内部表示是如何定义的情况下,我们无法说出每次分配占用多少内存,但可以公平地估计会产生一些开销。 开销是否可能取决于分配向量的大小(参见第一种情况,m = 50M)? 请注意,50M 表示每次分配 200MB,因此在这种情况下开销会非常小。开销由两部分组成:new/deletemalloc/free 用于跟踪“分配的内容”的管理块,以及将块大小向上舍入到某个对齐大小,通常为 8 或 16 个字节。因此,对于 200MB 的分配,开销百分比是分钟。在小分配的情况下,百分比开销要大得多。在第二种情况下,您的分配很少。 似乎每个向量的开销确实约为 16 个字节(1.6 个“缺失”GB / 100 M 个向量 ~= 每个向量 16 B)......但我想这是基于实现的,并且是最有可能在每个系统上有所不同

以上是关于向量c++的向量大小的主要内容,如果未能解决你的问题,请参考以下文章

C++中向量的大小

C++中向量的向量顺序

C++ 固定数量的向量大小作为类成员

初始化 C++ 向量的大小

以向量为成员的结构的 C++ 大小

如何获取 C++ 类成员向量的大小?