在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个字节,当存储的字符串长度超出的时候,会使用指针来对字符串进行存储,并且进行拷贝构造的时候两部分都会进行深拷贝。

转载于:https://www.cnblogs.com/lenomirei/p/5354362.html

STL库中string类内存布局的探究相关推荐

  1. c++ string最大长度_关于C++ std::string类内存布局的探究

    一切要从探讨指针的类型说起. 运行环境:Ubuntu 20.04.1 LTS 64-bit 预先准备:调整字节对齐单位为1,防止为4时因填充导致人脑判断失误 #pragma pack(1) 01 - ...

  2. STL库:string

    STL库:string 文章目录 STL库:string 1.STL库对于string类的介绍 2.string常用接口的掌握 2.1 string的构造接口 2.2 string的容量操作接口 2. ...

  3. C++STL库中不可或缺的部分—string(模拟实现)

    前文 大家好,本篇文章主要是讲解一下 string一些常用接口的模拟实现. 众所周知,在日常生活中,字符串无处不在,如 ''just do it'',''中国'',''一坤年''等,想要在计算机上将这 ...

  4. C++面试中string类的一种正确写法

    C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...

  5. C++11 中STL库中新增内容

    C++ 11一个比较显著的变化是以前boost库中的一些函数被正式标准化合入到STL中了,本文就简单的介绍一下. 引用包装器(Reference Wrapper) 当模板函数参数为泛型类型的时候,无法 ...

  6. 深入理解C++中string类(详解)

    深入理解C++中string类 背景介绍:在C++中使用string.h和cstring并不是所要介绍的string类指的是C语言库中字符串,而本文所要介绍的是string类.要使用string类主要 ...

  7. 标准C++中string类用法总结

    2019独角兽企业重金招聘Python工程师标准>>> 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好 ...

  8. c++ 输出string_来讲讲Java中String 类的知识点

    本文来总结一下Stirng 的有关知识点 1.String中的引用 String 可以通过new和构造方法来创建一个对象,用s来引用它(也就是相当于把asdf这个字符串赋值给s String s = ...

  9. 【持续更新】C++中string类使用总结

    C++中string类的功能以及使用方法可类比于C语言中的字符数组,但是相互比较之下可谓是是有过之而无不及,实在是太方便,故留此贴总结日常学习所得经验. 智障blog,排版这么难???? 1. 创建字 ...

最新文章

  1. idea创建一个html5,idea创建一个SpringBoot项目
  2. java new的是构造函数_Java构造函数
  3. 2019-06-12 Java学习日记之JDBC
  4. php抓取统计局区划代码,抓取国家统计局的代码和名称,爬取,区域,划分,及
  5. [译] SpaceAce 了解一下,一个新的前端状态管理库
  6. selenium+python,解决selenium弹出新页面,无法定位元素的问题(报错:Unable to locate element:元素)
  7. sqlloader 导入数据
  8. Python Roberts算子、Sobel算子——举例说明 ^_^
  9. MicrosoftStore无法下载软件
  10. linux执行telnet命令,Linux怎么使用telnet命令
  11. 英语介词at、in、on常见用法(时间、地点、方位)
  12. python web py入门(4)-从数据库读取数据显示到网页
  13. Economics Overview
  14. GNVM版本下载太慢用淘宝镜像速度提百倍哈
  15. Matlab实现自相关矩阵,自相关矩阵的计算
  16. 4K超高清电视全面支持HDMI技术
  17. 利用visio 画思维导图
  18. 【Excel基础训练】函数入门:基础操作与常用函数
  19. html如何自动调整边框大小,html5如何设置复选框大小
  20. 两片74161实现60进制_设计60进制的计数器_用eda设计60进制计数器_74ls161(3)

热门文章

  1. 超赞!这些 “电子” 艺术品,真绝了!
  2. 成为单片机高手必知的三个重要步骤(干货分享)
  3. Xilinx FPGA GTX的DRP速率配置详解
  4. 一个java小程序运行结果图_编写以下程序,并上传源代码和运行结果截图,附件中上传java源程序。...
  5. python locust 能压测数据库_python locust 性能测试:HOOKS钩子方法
  6. 按住 ctrl 并滚动鼠标滚轮才可缩放地图_Firefox 73 将引入全局缩放功能,在所有网站都可适用...
  7. Relatively Prime Powers CodeForces - 1036F (莫比乌斯函数容斥)
  8. 如何让博客变得稍稍好看
  9. async框架源码研究
  10. jquery替换onclick的方法