二维向量的大小
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 的平台上。这假定一个无状态分配器,这可能是正确的。
我一直在尝试计算二维向量的大小,但无法完全计算出来。
我写的测试程序如下
#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 的平台上。这假定一个无状态分配器,这可能是正确的。