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