目录
在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)。