從放假到現在,好久沒有碰過STL源碼了,回家的那段時間學習了lua,lua的學習資料比較少,有時間也發一些
關於lua的文章,這個只能說,有時間再說吧.沒事的時候就玩玩qt,文章在后面也會補上.
昨天呼呼的睡了一整天,晚上翻牆去了網絡中心,一直坐到現在,熟悉的環境,看來,我還是逃離不了自己內心
那份感情.但是,過去的就應該過去了,時間是可以改變這一切的,這只是時間問題.
關於STL學習比較好的資料推薦:www.cplusplus.com有些時候我也是喜歡將這個網站的文檔作為參考,然后
結合SGI STL源碼再分析,這樣就能很好的理解和深入.好了,廢話不多說了.下面就一起看看SGI STL中string的源碼.
如果你只是看到string的源碼,那么我笑了.兄弟,你絕對找不到string的源碼.因為sgi stl喜歡玩躲貓貓,相信前面
的一系列文章都可以看出這個問題,其實string中的basic_string就是string的實現,或者換一句更准確的話來說,
其實string是basic_string模板類的一種實現.在stl_string_fwd.h文件中可以看得出:
既然我們已經知道basic_string是string的原生實現,那么多說其他也無益.還是直接去看代碼吧.
照例,這三個變量就不需要多解釋了,STL的底層實現都是這個樣子的.
SGI STL在內存管理方面做的工作很多,所以string源碼中也當然要有. 像_String_alloc_base.看過前面分析的文章,
沒什么好的辦法,那就舉一反三,多思考吧.
至於_String_base嘛,其實就是分擔basic_string中的部分基礎內容,如果編寫在basic_string中也是沒有問題的.
不過其中有幾個方法是需要注意的,這和后面的,常用的string方法的實現有關系. 同時,也是和前面內存管理相關
的.
注: _M_allocate 返回申請的內存的頭指針.
_M_allocate_block 調用_M_allocate方法, 但是做了參數檢查和基礎變量的初始化工作,換據話說就是_M_allocate
方法的補全.
_M_deallocate 釋放申請的內存,至於參數n, 如果沒有記錯,應該是沒有作用的,在前面的文章中有分析過內存
釋放源碼,在那里有提到過.
_M_deallocate_block 同上,是對_M_deallocate_block方法的完善.
其實說_M_allocate_block和_M_deallocate_block方法的完善,並不是沒有道理的,從_String_base的構造方法就可
以看的出.
(相信這里和前面的相同的吧,不記得了~~ )
這里有兩個方法,都是檢查錯誤的.
basic_string私有繼承_String_base, 原因也是可以看的出的,因為_String中的方法是和內存申請釋放、數據初始化相關
的,所以不應該暴露.
下面應該來看看basic_string模板類的構造函數了.
這個構造函數應該仔細看看, 無參數的構造函數, 禁止邪惡的編譯器隱式自動轉換,我們可以看到,默認初始數據
存儲空間是8字節. (注意,存儲空間不是basic_string的大小,而是_M_start指向的內存空間的大小.)
__STL_TRY && __STL_UNWIND就是try catch的作用。
由於源碼層次比較多,之間的調用也都是跳轉就可以找的到的,所以我只給出construct最終使用的源碼,請看下面.
使用placement new在_M_finish位置上面放置一個元素. 思考了好久,但是沒有想明白,希望知道的同學可以告訴我。
在這篇文章的最后來說說destory .在前面的_M_terminate_string和_M_construct_null中都出現了,但是參數不同.
好吧,這個在前面其實介紹過了。
循環釋放_M_start -> _M_finish之間的空間.
其實后面的就是調用前面的_Destory函數. 這里就重復介紹一次了。
這篇文章更新的時間確實是有點久了,這段時間也比較忙。 不過過了剛開學這段時間,后面會清閑很多。
現在在物色人選和我一起分析開源項目或庫的源碼,需要點時間去找。 接着以后可能會考慮自己動手了。
下一篇文章我會介紹string源碼中剩余的方法和其他源碼.如有錯誤,歡迎拍磚.小弟謝過。