stl_vector源码分析

本文深入探讨了GCC 4.8版本与MSVC在Windows平台上的vector实现差异,详细解析了mingw、alloc_traits、vector_impl、vector_base等关键组件的作用与设计思路,以及新版与老版vector实现的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

  •   源代码基于版本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开头的一些有关空间分配,拷贝的函数(这个函数源码在vector.tcc文件中,通过多种typedef指向,最终我们会发现最终都指向T,T*,&T,所以感觉比老版本复杂多了,明明是T*类型,却又通过alloc指进去又指回来,到最后还是离不开我们的T)。

我们先来理一理它的设计思想,把空间分配拎出来,和包含指针对象的类组合起来。再对分配空间函数封装下,提供给你vector。
这是新版本的,老版本的就一个类,逻辑比这个要好懂的多,后续我再看看2.9版本的,老版本的设计思想还是值得借鉴的,之后的版本大都是对老版本的封装。

vector源码和分析图放在蓝奏上,需要自取:
https://www.lanzous.com/b00zcq1af
密码:a74h

补充:
找到了一些头文件声明的一些方法实现,在vector.tcc文件中。
比如_M_insert_aux,底层还是调用alloc,allocate相应版本的分配函数。

第二次补充:
一直觉得_M_start,_M_finish,_M_end属于alloc一部分,我们可以通过指向往下查找就会发现_M_start他们都是T类型,包括我们的迭代器,都是T类型。
老版本设计成一个类很直接可以看出来类型,所以归根结底还是对T*三个指针滑动,分配器迭代器都包含该类型的所有信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值