首页
Linux教程
Linux资讯
Linux入门
Linux运维
Linux系统
Linux服务器
Linux安全
Linux问答
SHELL
树莓派
正则
linux命令
安装
Linux监控
运维自动化
Ansible
Piwik
CentOS
Deepin
Ubuntu
Debian
FreeBSD
Nginx
Apache
openresty
Tengine
宝塔
SSH
页面位置:
Linuxboy
>
Linux教程
>
正文
string类 STL库
STL库中string类内存布局的探究
文章由LinuxBoy分享于2019-04-01 10:04:46
热评(609)
STL库中string类内存布局的探究
在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢?
这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符串被存储在了_Buf当中,_Mysize和_Myres就不用说了,就是上面的size 和 capacity 的值。
当只有一个字符作为字符串的时候,就可以很明显的看出来了,_Mysize是指字符串的length _Myres还是没有改变,_Myres最大就是15么?
此时还没有变化,再加入一个字符
可以变成31个,为什么一直都是2的几次方-1呢,string是字符串,默认给字符串留下一个结束符'\0'的空间
并且当你给的初始化字符串超过15个的时候,我们存储字符串的位置就改变了,不是在_Buf中而是转到了Ptr这个指针当中去了 这是因为string会实现分配16个字节的空间,当存储的字符串长度大于16个字节的时候,就去另外开辟空间,并把指针赋值给_Ptr,完成string对象的初始化(这与STL库中的内存配置器有关系,当实现分配的空间不满足需要的时候开辟空间) 接下来就来看看,是怎么进行拷贝构造的吧
可以看出,当时用指针的时候并不是进行浅拷贝,而是进行的深拷贝; 那么_Buf也一样么?是的也是进行的深拷贝
可以看出两部分的_Buf的地址是不一样的 那么也就是说在C++中string类使用的是深拷贝,并且有一个默认的存储缓冲区,大小是16个字节,当存储的字符串长度超出的时候,会使用指针来对字符串进行存储,并且进行拷贝构造的时候两部分都会进行深拷贝。
本文永久更新链接地址
:
相关内容
STL库的内存配置器(allocator)
STL库list::sort()实现深度解析
扩展C++ string类
今日最新
推荐文章:
STL库的内存配置器(allocator)
Java关于String类的赋值符号一些验证
STL库list::sort()实现深度解析
Java String类型时间比较大小
Lua中的string类型
CString类型转char类型出现中文乱码问题
评论暂时关闭
最新Linux教程教程
STL库中string类内存布局的探究
二叉搜索树的实现
Python基础教程:面向对象编程
STL的迭代器和类型萃取
Python基础教程:函数式编程
OpenCV3读取、写入和保存图像
Linux头条
OpenSUSE新版将支持3D安装界面
Android的frameworks层键盘事件处理
在RHEL 4中安装apache+mysql+php+Zend
Speex编解码在Android上实现
Java程序设计之循环链表
Puppy Linux 3.01发布下载
评论暂时关闭