SGI STL原代码分析之Vector(一)。
STL版本有很多种,STL是一套泛型编程框架标准,只要实现了这套标准的东西,都是叫做STL。。 所以STL有很多版本,
但是SGI STL是最为标准,而且是STL之父写的所以是最为权威的STL模板。
目的:分析Vector构造到Push_back这一系列过程中,STL中的实现过程。
开干。。。~!!!!
首先来到Vector这个类,Vector模板里面传递了两个参数,第一个是类型,是一个分配器,但是注意一下,这里传递进来的分配是有一个宏。我们先来看下这个宏的结构。
这个宏是用来控制分配器类型的。让我们继续看回我们的vetor中,发现,Vector是继承自父类Vector_Base的,我们来研究他的Vector_Base。
在Vector_Base中首先来看它中间的三个保护权限的三个参数
这里要说两个问题,第一, 为什么要设置成Proctected,第二,这三个参数是什么意思。
先来说第一个问题,为什么要设置成Proctected,因为想让子类继承后也可以访问。
这是在继承了Base的Vector里面找到的,这里定义了一个宏,还有一个using的用法,在后续来说明。
第二个问题,这三个参数是什么意思。
我不知道怎么准确描述,所以画了个图,, 大家自己看吧,挺形象的。
继续分析。!!~接下来我们来看都是怎么初始化这三个参数的吧。
这里仔细看下这些画了红色的,标记,这里发现用了一个模板类进来,simple_alloc<_Tp, _Alloc>,并且给它传递了两个参数,分别是类型_Tp和_Alloc进去,并且在构造函数中调用的方法也是来自这个simple_alloc<_Tp, _Alloc>。所以,接下来当然就是来看看看这个模板类的实现了。。。
#分配器:在我们的 _Base 类中, 我们知道存在 分配内存 和 释放内存 两个方法, 这两个方法存在于 simple_alloc 这个类中.
这个类位于 stl_alloc.h 中.
在STL中,内存的分配和释放都是来自分配器的。在构造函数中只是调用了分配器中分配内存的方法而已。。 到这里为止,VecetorBase里面的内容就到此结束了。。 下面放上Base里面的代码详解。
总结:
1.Vector类中是没有构造函数的,而函数的构造是来自VectorBase。
2.VectorBase中在构造函数的时候分为两种情况 NO.1 不指定构造的大小长度。 No.2 指定了构造的大小。
3.VectorBase在指定了生成的大小的时候会调用分配器中的方法,来分配空间。
4.由上可知,在分配器中做的只是内存的分配和释放,而方法的构造是在VctorBase当中完成的,所以可以这样来看,
分配器,在STL架构中只是相当于实现operator new 和 operator delete 这样的操作,new operator=operator new+place new 所以,Vectorbase在这里做的是Place new 的操作。
VectorBase就分析到这里了。。跑路咯~!!!!!^_^