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


    从放假到现在,好久没有碰过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源码中剩余的方法和其他源码.如有错误,欢迎拍砖.小弟谢过。

     
  • 相关阅读:
    Redis02——Redis单节点安装
    Redis01——Redis产生背景
    验证元素的唯一性(二重循环法和快排优化)
    线性同余法的伪随机数
    转载(为啥要对10000007取模)
    (算法专题)使用常微分方程将递归转换为非递归
    算法设计与分析——习题一
    PAT Basic 1030 完美数列 (25 分)
    禁止yum update 自动更新系统内核
    Redis AOF 持久化方式
  • 原文地址:https://www.cnblogs.com/respawn/p/2674635.html
Copyright © 2020-2023  润新知