std::vector内存结构简析

目录

实验

总结


在CppCon 2019的演讲(https://www.youtube.com/watch?v=St0MNEU5b0o&t=2171s  3分48秒)中,Klaus Iglberger给出了std::vector的内存结构:

vector其实是一个结构体,它的内容其实是3个指针构成的。第一个指针是首元素的地址,第二个指针是最后一个元素的地址 + 1(即最后一个元素的最后一个字节的地址+1),第三指针是vector::capacity的最后一个元素的地址 + 1。

假如vector内容为空,则三个指针的内容均为0(nullptr)。

实验

下面对其进行验证。写了一个简短的程序,32位编译。看如下代码。vec1的地址0xEFFD2C保存在p1变量内,vec2的地址保存在指针p2内。

可见,vec1地址内包含4x4=16个字节,从48E21D01到00000000.前4个字节构成一个4字节整型,对应vec1的_Myproxy.后面的12个字节全是0,其实是3个整型int.对应vector的首元素地址,末元素地址+1和capacity尽头的地址+1。因为vec1为空,所以3个整型全是零。

vec2的地址是0xEFFD14  同样包含16个字节。前4个字节对应vec2的_Myproxy。后面的12个字节也是3个int组成。第一个是0x011ddcd0,对应vec2的首字节(_Myfirst);第二个是0x011ddcdc,对应vec的末字节地址+1(_Mylast).最后是vec2::capacity的最后一个字节的地址+1(_Myend)。由于vec2的capacity==3,所以_Myend == _Mylast

总结

vector可以看做是结构体,由4个指针构成。第一个指针对应_Myproxy。第二个指针是vector首元素的地址,第3个指针是vector最后一个元素的地址+1,最后的指针是vector::capacity的最后一个元素的地址+1。假如vector内容为空,则最后三个指针的内容均为0(nullptr)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值