C++ Standard Stl -- SGI STL源码学习笔记(08) string

news/2024/7/20 16:08:51 标签: c/c++, 内存管理, lua

从放假到现在,好久没有碰过STL源码了,回家的那段时间学习了lua,lua的学习资料比较少,有时间也发一些

关于lua的文章,这个只能说,有时间再说吧.没事的时候就玩玩qt,文章在后面也会补上.

 

昨天呼呼的睡了一整天,晚上FQ去了网络中心,一直坐到现在,熟悉的环境,看来,我还是逃离不了自己内心

那份感情.但是,过去的就应该过去了,时间是可以改变这一切的,这只是时间问题.

 

关于STL学习比较好的资料推荐:www.cplusplus.com有些时候我也是喜欢将这个网站的文档作为参考,然后

结合SGI STL源码再分析,这样就能很好的理解和深入.好了,废话不多说了.下面就一起看看SGI STL中string的源码.

 

如果你只是看到string的源码,那么我笑了.兄弟,你绝对找不到string的源码.因为sgi stl喜欢玩躲猫猫,相信前面

的一系列文章都可以看出这个问题,其实string中的basic_string就是string的实现,或者换一句更准确的话来说,

其实string是basic_string模板类的一种实现.在stl_string_fwd.h文件中可以看得出:

既然我们已经知道basic_string是string的原生实现,那么多说其他也无益.还是直接去看代码吧.

 

照例,这三个变量就不需要多解释了,STL的底层实现都是这个样子的.

 

SGI STL在内存管理方面做的工作很多,所以string源码中也当然要有. 像_String_alloc_base.看过前面分析的文章,

没什么好的办法,那就举一反三,多思考吧.

 

至于_String_base嘛,其实就是分担basic_string中的部分基础内容,如果编写在basic_string中也是没有问题的.

不过其中有几个方法是需要注意的,这和后面的,常用的string方法的实现有关系. 同时,也是和前面内存管理相关

的.

注: _M_allocate  返回申请的内存的头指针.

  _M_allocate_block 调用_M_allocate方法, 但是做了参数检查和基础变量的初始化工作,换据话说就是_M_allocate

            方法的补全.

    _M_deallocate   释放申请的内存,至于参数n, 如果没有记错,应该是没有作用的,在前面的文章中有分析过内存

          释放源码,在那里有提到过.

    _M_deallocate_block 同上,是对_M_deallocate_block方法的完善.

 

其实说_M_allocate_block和_M_deallocate_block方法的完善,并不是没有道理的,从_String_base的构造方法就可

以看的出.

(相信这里和前面的相同的吧,不记得了~~ )

这里有两个方法,都是检查错误的.

 

basic_string私有继承_String_base, 原因也是可以看的出的,因为_String中的方法是和内存申请释放、数据初始化相关

的,所以不应该暴露.

 

下面应该来看看basic_string模板类的构造函数了.

这个构造函数应该仔细看看, 无参数的构造函数, 禁止邪恶的编译器隐式自动转换,我们可以看到,默认初始数据

存储空间是8字节. (注意,存储空间不是basic_string的大小,而是_M_start指向的内存空间的大小.)

__STL_TRY && __STL_UNWIND就是try catch的作用。

由于源码层次比较多,之间的调用也都是跳转就可以找的到的,所以我只给出construct最终使用的源码,请看下面.

 使用placement new在_M_finish位置上面放置一个元素.  思考了好久,但是没有想明白,希望知道的同学可以告诉我。

在这篇文章的最后来说说destory .在前面的_M_terminate_string和_M_construct_null中都出现了,但是参数不同.

好吧,这个在前面其实介绍过了。

循环释放_M_start -> _M_finish之间的空间.

其实后面的就是调用前面的_Destory函数. 这里就重复介绍一次了。

 

这篇文章更新的时间确实是有点久了,这段时间也比较忙。 不过过了刚开学这段时间,后面会清闲很多。

现在在物色人选和我一起分析开源项目或库的源码,需要点时间去找。 接着以后可能会考虑自己动手了。

 

下一篇文章我会介绍string源码中剩余的方法和其他源码.如有错误,欢迎拍砖.小弟谢过。

 

转载于:https://www.cnblogs.com/respawn/archive/2012/09/10/2674635.html


http://www.niftyadmin.cn/n/1753469.html

相关文章

匈牙利命名法、骆驼命名法和帕斯卡命名法

一、匈牙利命名法: 广泛应用于象Microsoft Windows这样的环境中。 Windows 编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一位能干的 Microsoft 程序员查尔斯西蒙尼(Charles Simonyi) 提出的。 匈牙利命名法通过在变量…

pyhton 怎么允许索引超出列表_python基础gt;列表

常用序列结构:字符串、列表、元祖、字典、集合序列是一种数据存储方式,用来存储一系列的数据,在内存中,序列是一块用来存放多个值得连续的内存空间。列表:用于存储任意数目、任意类型的数据集合。Python的列表大小可变…

Linux内核目录结构

/include 子目录包含了建立内核代码是所需要的大部分包含文件,这个模块利用其他模块重建内核; /init 子目录包含了内核的初始化代码,这是内核工作的开始起点; /arch 子目录包含了所有硬件结构特定的内核代码,如&#x…

controller类中使用json返回错误码,实现用户登录

1、后台代码示例 ResponseBodyRequestMapping(value"login",method RequestMethod.POST)public User login(String username, String password, HttpServletRequest request,HttpServletResponse response) throws Exception{try {User user userService.login(us…

[KR学习]单词记数

为什么80%的码农都做不了架构师&#xff1f;>>> /** filename: wc.c* function: UNIX系统中统计行数,字数及字节数* date: 2012年 09月 11日 星期二 13:38:10 CST*/ #include <stdio.h>#define OUT 0 /* outside a word */ #define IN 1 /* inside a wor…

五轴数控转台_你真的了解五轴加工吗?看完你会恍然大悟!

五轴加工(5 Axis Machining)&#xff0c;顾名思义&#xff0c;数控机床加工的一种模式。采用X、Y、Z、A、B、C中任意5个坐标的线性插补运动&#xff0c;五轴加工所采用的机床通常称为五轴机床或五轴加工中心。可是你真的了解五轴加工吗&#xff1f;五轴技术的发展几十年来&…

转json由于pojo类不完善造成的各类报错问题

1、pojo类要继承java.io.Serializable public class User implements java.io.Serializable{} 2、利用hibernate反转生成映射实体类&#xff0c;必须修改对应entity文件&#xff0c;修改规则如下 如果config表的ownerId是外键&#xff0c;参考表user表id主键 在User类中给get…

Guacamole安装step by step,实现基于web的vnc客户端

Guacamole是指“鳄梨色拉酱”&#xff0c;也许是一种美食&#xff0c;所谓“鳄梨”貌似是一种热带水果。这里要讲的Guacamole是一种基于HTML5和AJAX技术的vnc客户端&#xff0c;有了它就可以直接通过web浏览器&#xff0c;快速访问vnc server上的Xwindows系统界面了。优酷上有一…