向量的<T>内存结构

memory structure of a vector<T>

本文关键字:内存 结构 gt lt 向量      更新时间:2023-10-16

我正在玩 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 00CC CC CC CC 30 31 82 1F

找到begin()._Ptrend()._Ptr存储在那里的地址...


以及在该地址范围中找到的整数:

内存位置的第一个整数:0031A538 = 01 00 00 00

内存位置的第二个整数:0031A53C = 02 00 00 00

内存位置的第三个整数:0031A540 = 03 00 00 00

内存位置的第 4 个整数:0031A544 = 04 00 00 00

内存位置的第 5 个整数:0031A548 = 05 00 00 00

内存位置的第 6 个整数:0031A54C = 06 00 00 00


问题:

如果002EF8B8是向量的内存位置,31 00 38 a531 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]

你误解了字节。在小端计算机上,值 0x0031A538 用字节序列 38 A5 31 00 表示。因此,您的亮点发生了变化。

实际上,您这里有四个地址:0x00319D00,0x0031A538,0x0031A550和再次0x0031A550。

向量至少需要三个值来控制其数据,其中之一显然是向量基。另外两个可以是指向矢量末尾和分配区域末尾的指针,也可以是大小。

0x0031A538显然是向量基,0x0031A550既是它的终点,也是分配区域的终点。那么,仍然需要解释的是价值0x00319D00。