我正在玩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 cc cc cc 30 31 82 1f
找到了存储在那里的begin()._Ptr
和end()._Ptr
个地址......
和在该地址范围内找到的整数:
内存位置的第1个int:0031A538 = 01 00 00 00
内存位置的第二个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]
答案 0 :(得分:5)
你误解了字节。在小端机器上,值0x0031A538用字节序列38 A5 31 00表示。因此,您的高亮显示会被移位。
实际上你这里有四个地址:0x00319D00,0x0031A538,0x0031A550和0x0031A550。
向量最低限度需要三个值来控制其数据,其中一个显然是向量基数。另外两个可能是指向矢量末尾的指针和分配区域的末尾,或者是大小。
0x0031A538显然是向量基数,0x0031A550既是它的结束也是结束的分配区域。那么,还需要解释的是值0x00319D00。