從定義可知,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
中預設的模板引數_traits
為char_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::length
,basic_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 節點物件包含兩個節點物件指標,分別指向前乙個節點和後乙個節點,還有乙個節點物件存放的資...