gpt4 book ai didi

c++ - 二维 vector 的大小

转载 作者:行者123 更新时间:2023-11-28 05:24:10 25 4
gpt4 key购买 nike

我一直试图计算出二维 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 的帮助下检查时,内存分配让我感到困惑。在主 block 中执行第一条语句后,我得到以下输出。

==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;dr

第一种情况仅显示了 vector 管理的 ( int) 存储的分配。第二个显示了内部 vector 的 int存储,以及内部 vector 对象本身的存储


所以它告诉你这个

vector<int> one(1);

分配一个 4 字节的 block 。

它不会告诉您 vector 对象本身的自动存储,只告诉您单个整数的动态存储:假设sizeof(int)==4 , 这似乎很合理。

接下来它会告诉你:

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

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

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

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

对于 std::vector 来说,24 字节是否合理?实例?这很容易

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

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

关于c++ - 二维 vector 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com