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)。

std::vector内存结构简析

实验

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

std::vector内存结构简析

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

std::vector内存结构简析

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

std::vector内存结构简析

总结

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

上一篇:C++描述 LeetCode 567. 字符串的排列


下一篇:C++ string vector 转换