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

发布了72 篇原创文章 · 获赞 83 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41033366/article/details/105174384
今日推荐