容器类内存分析

vector容器

  • 和array区别在于空间运用的灵活性。线性,单端数组
  • vector是一个类,继承自__vector_base
  • 三个成员变量__begin_指向容器元素起始地址,__end_指向末尾元素地址下一个指针,__end_cap_表示这次容器容量,满则开辟新空间。

image.png

void start() {
    vector<int> v;
    // 24,三个成员变量的指针
    cout << sizeof(v) << endl;
}
  • 调试看内存

image.png

string容器

  • 源码可以看出,string容器是有短字符串优化的机制的。实际是分析的basic_string内存布局。
  • 字符串有多短看样子,取决于目标架构(???)。
  • 长字符串24个字节,__data_指向实际字符串的指针,__size_实际大小,__cap_容器此次容量,满则开辟新空间。

image.png

  • 源码可以看出,短字符串会占用2个或者23个字节的空间。由于字符数组最后以\0结束,实际长度为22。字符串长度等于23时采用上面长字符内存布局方式布局。__size_占一个字节表示字符串长度。

image.png

  • 先给s22个字符,lldb调试看结果。

image.png