我一直在试图找出二维向量的大小而不能完全弄明白。
我写的测试程序如下。
#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
请帮助理解内存的分配方式。
答案 0 :(得分:1)
第一种情况只显示了向量管理的(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的平台上。这假设一个无状态分配器,这可能是正确的。