string的存储结构
class string {
union Buffer{
char * _pointer;
char _local[16];
};
size_t _size;
size_t _capacity;
Buffer _buffer;
};
string对象共占32个字节,buffer 占 16个字节,size和capacity共占用16个字节
验证
可以通过如下程序进行验证:
#include <iostream>
#include <string>
using namespace std;
void test0(){
string str1 = "hello,world!!!!";
string str2 = "hello,world!!!!!";
cout << &str1 << endl;
printf("%p\n", &str1[0]);
cout << &str2 << endl;
printf("%p\n", &str2[0]);
}
int main()
{
test0();
return 0;
}
[looechao@fedora cpp12]$ ./a.out
0x7ffcdfdd77d0
0x7ffcdfdd77e0
0x7ffcdfdd77b0
0xbe2f2b0
可以发现SSO的策略如下:
graph TD A[String对象: 32字节] --> B{字符串长度} B -->| < 15字节| C[使用SSO策略] B -->| 超过15字节| D[使用堆内存] C --> E[Buffer._local存储<br>直接使用栈空间<br>16字节] D --> F[Buffer._pointer指向<br>堆上分配的内存] subgraph "String对象结构" direction TB G[_size: 8字节] H[_capacity: 8字节] I[Buffer联合体: 16字节] G --> H --> I end
- 针对16个字节以内的字符串,直接使用栈上的空间存储buffer
- 针对16个字节以上的字符串,将buffer存在堆区