目录
一、string的成员
1.VS
2.Linux
二、string的扩容机制
1. VS
2.Linux
一、string的成员
string是C++标准库中的一个类模板,用于表示和操作字符串
string在 Windows 与 Linux 中的成员不是相同的
1.VS
4个成员:_str , _size , _capacity 和 buf[15]
32位下共28字节:4 ,4 ,4 ,16
Windows系统下会开辟 buf 数组,可以减少小字符串的内存开销,更高效的利用系统内存
每当创建一个string对象时,编译器就会检查当前字符串的大小,如果小于16,就使用buf来储存;如果大于16,就会重新开辟对应长度的空间(此时buf废弃)
2.Linux
首先需要注意,Linux下默认是64位系统,所以指针的大小为 8 字节!!
运行程序后,打印结果为 8,所以 string 的成员只有一个指针,这个指针指向一个空间(结构体),这个空间内包含如下成员:
— size(字符串长度)
— capacity(空间大小)
— 引用计数(用于写时拷贝)
在内存中存储时只有一个字符串,不过这个字符串每次都会多开12个字节,前4个存size,中间4个存capacity,后4个存引用计数。需要改变数据时偏移相应的字节,转成int*后解引用。这个指针指向字符串的开始,即这12个字节后
写时拷贝:有时拷贝时不去写(修改),就不会去重新拷贝,只有当写 时,才会拷贝;如果不写,则不用拷贝(提高效率)。当引用计数为0时,才会析构这段空间
二、string的扩容机制
1. VS
很明显,是1.5倍扩容
2.Linux
2倍扩容