向量的<T>内存结构
memory structure of a vector<T>
我正在玩 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()._Ptr
和end()._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 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]
你误解了字节。在小端计算机上,值 0x0031A538 用字节序列 38 A5 31 00 表示。因此,您的亮点发生了变化。
实际上,您这里有四个地址:0x00319D00,0x0031A538,0x0031A550和再次0x0031A550。
向量至少需要三个值来控制其数据,其中之一显然是向量基。另外两个可以是指向矢量末尾和分配区域末尾的指针,也可以是大小。
0x0031A538显然是向量基,0x0031A550既是它的终点,也是分配区域的终点。那么,仍然需要解释的是价值0x00319D00。
- 如何在C++类内存结构中创建"spacer"?
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 使用内存地址访问结构的属性值
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 包含矢量指针的结构的内存释放问题
- 如何在cpp中删除(免费)多维结构内存?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 公共/私有/受保护是否会更改内存中结构的排列?
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 从只读内存中读取结构
- 具有 STL 类 c++ 的结构的内存分配
- 相同的结构可以在C++中分配不同的内存大小吗?
- 我可以使用哪种数据结构来释放连续内存中的内存?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- C++编译大型结构时内存使用过多
- 使用Hazelcast替换共享内存结构数据
- c++ WINAPI 共享内存结构数组
- 向量的<T>内存结构
- 使用C和Cpp跟踪内存结构