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開頭的一些有關空間分配,拷貝的函數(這個函數源碼在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*三個指針滑動,分配器迭代器都包含該類型的所有信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章