向量<T>的内存结构

Ubi*_*ica 0 c++ memory stdvector

我正在玩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 a531 00 50 a5 31 00 cc cc cc cc 30 31 82 1f

找到begin()._Ptrend()._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>      +---
Run Code Online (Sandbox Code Playgroud)

这基本上是 [_Myproxy] [_Myfirst] [_Mylast] [_Myend]

ach*_*ach 5

你误解了字节.在小端机器上,值0x0031A538用字节序列38 A5 31 00表示.因此,您的高亮显示被移位.

实际上你这里有四个地址:0x00319D00,0x0031A538,0x0031A550和0x0031A550.

向量最低限度需要三个值来控制其数据,其中一个显然是向量基数.另外两个可以是指向矢量末尾的指针,也可以是分配区域的末尾或大小.

0x0031A538显然是向量基,0x0031A550是它的结束和分配区域的结束.那么,还需要解释的是值0x00319D00.