二维向量的大小

时间:2016-11-30 15:31:38

标签: c++ vector size valgrind

我一直在试图找出二维向量的大小而不能完全弄明白。

我写的测试程序如下。

#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

请帮助理解内存的分配方式。

1 个答案:

答案 0 :(得分:1)

TL;博士

第一种情况只显示了向量管理的(func addTextfieldRightView(){ let rightViewWidth:CGFloat = 30 let viewMax = self.searchTxt.frame.height let buttonMax = self.searchTxt.frame.height - 16 let buttonView = UIView(frame: CGRect( x: self.searchTxt.frame.width - rightViewWidth, y: 0, width: viewMax, height: viewMax)) let myButton = UIButton(frame: CGRect( x: (viewMax - buttonMax) / 2, y: (viewMax - buttonMax) / 2, width: buttonMax, height: buttonMax)) myButton.setImage(UIImage(named: "BlueClear")!, for: .normal) buttonView.addSubview(myButton) let clearPressed = UITapGestureRecognizer(target: self, action: #selector(SearchVC.clearPressed(sender:))) buttonView.isUserInteractionEnabled = true buttonView.addGestureRecognizer(clearPressed) myButton.addTarget(self, action: #selector(SearchVC.clearPressed(sender:)), for: .touchUpInside) self.searchTxt.rightView = buttonView self.searchTxt.rightViewMode = .whileEditing } )存储的分配。第二个显示内部向量&#39; int存储,和内部向量对象本身的存储

所以它告诉你这个

int

分配一个4字节的块。

它没有告诉你矢量对象本身的自动存储,只有单个整数的动态存储:假设vector<int> one(1); ,这似乎很合理。< / p>

接下来它会告诉你:

sizeof(int)==4

总共分配两个28字节的块。

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

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

对于vector<int>实例,24个字节是否合理?这可能很容易

std::vector

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