二维向量的大小

size of 2 dimensional vector

我一直在尝试计算二维向量的大小,但无法完全计算出来。

我写的测试程序如下

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> one(1);
    vector < vector<int> > two(1, vector <int>(1));

    return 0;
}

我在 valgrind 的帮助下检查时的内存分配让我很困惑。在主块中执行第一条语句后,我得到以下输出。

==19882==    still reachable: 4 (+4) bytes in 1 (+1) blocks

到目前为止一切顺利。但是在 运行 下一条语句之后,我得到了以下日志。

==19882==    still reachable: 32 (+28) bytes in 3 (+2) blocks

现在这很混乱,我不知道如何证明分配的 28 个字节是合理的。 如果我将第二行更改如下

vector < vector<int> > two(1, vector <int>(0));

我得到以下日志

==19882==    still reachable: 32 (+24) bytes in 3 (+1) blocks

请帮助理解内存是如何分配的。

tl;博士

第一种情况仅显示了向量管理的 (int) 存储的分配。第二个显示了内部向量的 int 存储 和内部向量对象本身的存储 .


所以它告诉你这个

vector<int> one(1);

分配一个 4 字节的块。

它没有告诉你矢量对象本身的自动存储,只有单个整数的动态存储:假设sizeof(int)==4,这看起来很漂亮合理。

接下来它告诉你:

vector < vector<int> > two(1, vector <int>(1));

再分配两个总计 28 字节的块。

现在,其中一个块将包含 vector<int> 的动态存储 - 请记住之前的实例是自动本地 - 另一个块将包含嵌套向量的单个整数的动态存储。

我们可以假设第二个(单个整数)分配是一个 4 字节的块,就像上次一样。因此,动态分配的 vector<int> 本身在另一个块中占用了 24 个字节。

对于 std::vector 实例,24 字节大小是否合理?那很容易

template <typename T> class vector {
    T* begin;
    size_t used;
    size_t allocated;
};

在具有 64 位指针和 size_t 的平台上。这假定一个无状态分配器,这可能是正确的。