String在VS与Linux下的区别

发布时间:2024年01月21日

目录

一、string的成员

?1.VS

2.Linux?

二、string的扩容机制

1. VS

2.Linux?


?

一、string的成员

string是C++标准库中的一个类模板,用于表示和操作字符串

string在 Windows 与 Linux 中的成员不是相同的

?1.VS

4个成员:_str ,? _size ,? _capacitybuf[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倍扩容

文章来源:https://blog.csdn.net/weixin_73885716/article/details/135715364
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。