STL原始碼分析 string

2022-07-12 05:57:11 字數 1828 閱讀 9562

從定義可知,string其實是base_string的特化類,string使用預設的記憶體分配器__stl_default_allocator(_chart)

template , 

class _alloc = __stl_default_allocator(_chart) >

class basic_string;

typedef basic_stringstring;

traits是c++中乙個重要特性,使用traits可在編譯器確定型別相關的資訊。比如某個模板引數是否為整形。string中預設的模板引數_traitschar_traits<_chart>, 定義如下

template class char_traits

: public __char_traits_base<_chart _chart>

{}

可以看到char_traits<_chart>繼承自__char_traits_base<_chart _chart>,其中定義了字元型別_chart的各種操作,供basic_string方法呼叫:例如basic_string::operator=中呼叫了__char_traits_base::lengthbasic_string::clear中呼叫了__char_traits_base::assign以下是一些常見的字元操作

static void assign(char_type& __c1, const char_type& __c2) 

static bool eq(const _chart& __c1, const _chart& __c2)

static bool lt(const _chart& __c1, const _chart& __c2)

string的記憶體結構類似於vector,由一段連續的記憶體緩衝區組成,_m_start為已用緩衝區的首位址,_m_finish為已用緩衝區的尾位址,_m_end_of_storage為空閒緩衝區的尾位址, 如下圖所示

因為string的api和vector類似,因此方法也類似, 此處略過

執行clear時,string占用的記憶體並不會釋放,只是_m_finish = _m_start而已。因此如果需要釋放string記憶體,可執行`str.swap(string())``

執行reserve(len)時,會重新分配1+max(size()+len)大小的記憶體緩衝區, 並將舊緩衝區資料複製到新緩衝區,開銷比較大。因此不要隨便執行reserve,以免記憶體的重新分配複製。當確定某個物件的最大長度時,可使用reserve預分配足夠大的記憶體,可避免後續字串增長導致記憶體的重新分配複製。

推薦閱讀

String原始碼分析

前言 string類在日常開發過程中使用頻率非常高,平時大家可能看過string的原始碼,但是真的認真了解過它麼,筆者在一次筆試過程中要求寫出string的equals方法,瞬間有點懵逼,憑著大致的理解,算是寫出來了,可是下來一翻string的原始碼頓悟,原來自己寫得是多麼的low,所以有必要把這些...

STL原始碼分析set

include include using namespace std int main set iset ia,ia 5 cout size iset.size endl cout 3 count iset.count 3 endl iset.insert 3 cout size iset.siz...

STL原始碼分析 List

鍊錶是一種線性表,但不會按照線性的順序儲存。鍊錶每次插入和刪除乙個元素,只配置或者釋放乙個元素空間,對於任何位置的元素的插入或者刪除,list永遠是常量時間複雜度。template struct listnode 節點物件包含兩個節點物件指標,分別指向前乙個節點和後乙個節點,還有乙個節點物件存放的資...