stl_vector源码分析
说明
- 源代码基于版本gcc 4.8(在linux环境下),和现在用的mingw差不多。
- 这里先说明下,mingw是个老大爷基于gcc开发的,用在windows平台上,稳定性不算很高(易出bug),同在windows下版本的还有msvc(微软开发的),和gcc版本的stl差别有些大,对于vector开辟空间的逻辑也不同。
分析
从上到下,根据代码顺序分析。
主要是四个大块:
1、Alloc部分,就是对应的alloc_traits,因为vector是泛型类,所以会将alloc首先特化成对应T相关类型(特化这方面我不确定,alloc_traits源码比较分散)。这个也就是vector_impl的基。
2、vector_impl是vector类实际占用空间的部分,它所占有的代码很少,其中包含了三个指针,如图所示start,finish,end_of_storage(目前最大可分配到的地方),一共占用12个字节。它继承了alloc,这个三个指针也是分配器相关类型。
3、vector_base,封装了包含了一个vector_impl对象,定义了alloc分配空间的一些相关函数。比如allocate,deallocate。
4、正主vector,它公有继承vector_base,也继承了它的对象。构造函数,会创建一个空对象。这里面封装的就是我们用到的各种函数:
begin,end,reverse,size等等。这些封装的函数很多直接对三个指针操作实现,但是有些函数又调用了_M开头的一些有关空间分配,拷贝的函数(这个函数源码的位置我找了好久没找到,但是因为_M开头,推测是在alloc_traits相关文件中)。
我们先来理一理它的设计思想,把空间分配拎出来,和包含指针对象的类组合起来。再对分配空间函数封装下,提供给你vector。
这是新版本的,老版本的就一个类,逻辑比这个要好懂的多,后续我再看看2.9版本的,老版本的设计思想还是值得借鉴的,之后的版本大都是对老版本的封装。
vector源码和分析图放在蓝奏上,需要自取:
https://www.lanzous.com/b00zcq1af
密码:a74h
补充:
找到了一些头文件声明的一些方法实现,在vector.tcc文件中。
比如_M_insert_aux,底层还是调用alloc,allocate相应版本的分配函数。