我正在c++中玩向量,我试图弄清楚向量在内存中的样子.
我做了一个像这样的向量:vector<int> numbers = { 1, 2, 3, 4, 5, 6 };,并提取了几个关于向量的信息。
&numbers:002EF8B8
begin()._Ptr:0031A538
end()._Ptr:0031A550
矢量存储器位置002EF8B8处的数据:
00 9d 31 00 38 a5 31 00 50 a5 31 00 50 a5 31 00 cc 30 31 82 1 f
找到了存储在那里的begin()._Ptr和end()._Ptr地址。
在该地址范围内找到的整数:
内存位置第1 int : 0031A538 = 01 00 00 00
内存位置第2 int : 0031A53C = 02 00 00 00
内存位置第3 int : 0031A540 = 03 00 00 00
位于内存位置的第4 int : 0031A544 = 04 00 00 00
位于内存位置的第5 int : 0031A548 = 05 00 00 00
位于内存位置的第6 int : 0031A54C = 06 00 00 00
问题:
如果002EF8B8是向量的内存位置,31 00 38 a5和31 00 50 a5是向量的开始和结束,那么开始的00 9d是什么,之后的数据是什么?31 00 50 a5 31 00 cc cc cc cc 30 31 82 1f
我得到了numbers.size()*sizeof(int)的大小,但我几乎可以肯定,这不是内存中向量的实际大小。
能否有人向我解释如何得到实际向量的大小,以及它的每个部分代表什么?
类似于:
数据大小[2 bytes] [4 bytes] [4 bytes] [? bytes]
数据含义为[something] [begin] [end] [something else]
编辑: bcrist建议使用/d1reportAllClassLayout并生成此输出。
1> class ?$_Vector_val@U?$_Simple_types@H@std@@ size(16):
1> +---
1> | +--- (base class _Container_base12)
1> 0 | | _Myproxy
1> | +---
1> 4 | _Myfirst
1> 8 | _Mylast
1> 12 | _Myend
1> +---它基本上是[_Myproxy] [_Myfirst] [_Mylast] [_Myend]
发布于 2014-12-14 04:43:29
你曲解了字节。在一台小型端机器上,值0x0031A538用字节序列38 A5 31 00表示。所以你的亮点变了。
实际上,这里有四个地址: 0x00319D00、0x0031A538、0x0031A550和0x0031A550。
一个向量最少需要三个值来控制它的数据,其中之一显然是矢量基。另外两个可以是指向向量结束和分配区域结束的指针,也可以是大小。
0x0031A538显然是矢量基,0x0031A550既是其末端,也是分配区域的末端。那么,还需要解释的是0x00319D00的值。
https://stackoverflow.com/questions/27466373
复制相似问题