string的寫時拷貝分析

2021-09-30 08:26:14 字數 1391 閱讀 8524

在本機器上呼叫sizeof(string)的時候,答案為4

於是好奇之

typedef basic_string string;

*  a string looks like this:

*  @code

*                                        [_rep]

*                                        _m_length

*   [basic_string]            _m_capacity

*   _m_dataplus                          _m_refcount

*   _m_p ---------------->               unnamed array of char_type

*  @endcode

只有乙個成員變數:

mutable _alloc_hider _m_dataplus;

讓我們看看這個成員變數

struct _alloc_hider : _alloc

_chart* _m_p; // the actual data. };

看出來它只有乙個char *指標

那麼string的length呢?

size() const

_m_rep() const

_m_data() const

_m_data()返回的是char *指標的位置,也就是說假設string a="abc"

*a.getdata()是'a'

這樣看來,在char *之前還有一段東西

base_string初始化的時候就預先分配了這個空間

basic_string()

#ifndef _glibcxx_fully_dynamic_string

: _m_dataplus(_s_empty_rep()._m_refdata(), _alloc())

static _rep&

_s_empty_rep()

static _rep&

_s_empty_rep()

template

typename basic_string<_chart, _traits, _alloc>::size_type

basic_string<_chart, _traits, _alloc>::_rep::_s_empty_rep_storage[

(sizeof(_rep_base) + sizeof(_chart) + sizeof(size_type) - 1) /

sizeof(size_type)];

_chart*

_m_refdata() throw()

string類的寫時拷貝

由於淺拷貝使多個物件共用一塊記憶體位址,呼叫析構函式時導致一塊記憶體被多次釋放,導致程式奔潰。實現string類的時候通常顯示的定義拷貝建構函式和運算子過載函式。由於釋放記憶體空間,開闢記憶體空間時花費時間,因此,在我們在不需要寫,只是讀的時候就可以不用新開闢記憶體空間,就用淺拷貝的方式建立物件,當...

String引用技術寫時拷貝

string類的賦值淺拷貝會使多個物件指向同一塊空間,當呼叫析構函式時會使一塊空間釋放多次,導致程式崩潰。再進一步我們會想到深拷貝,呼叫拷貝構造或賦值時會拷貝一塊新的空間,並將值拷貝下來,這樣各自指向自己的資料塊,析構時釋放各自的資料塊。但由於不斷的開闢空間 釋放空間會花費時間,而且當建立物件較多時...

String類 (淺拷貝 深拷貝 寫時拷貝)

淺拷貝是指當物件的字段值被拷貝時,字段引用的物件不會被拷貝。例如,如果乙個物件有乙個指向字串的字段,並且我們對該物件做了乙個淺拷貝,那麼兩個物件將引用同乙個字串。存在問題 如果源程式中沒有顯示定義拷貝建構函式,在進行物件的拷貝時,將呼叫系統預設的拷貝建構函式,這就使得兩個物件指向了同一資源,而析構函...