C string的內部究竟是什麼樣的?

2022-01-09 22:36:11 字數 1173 閱讀 9085

在c語言中,有兩種方式表示字串:

兩種形式總是以\0作為結束標誌。

c++ string 與它們在c語言中的前身截然不同。首先,也是最重要的不同點,c++ string 隱藏了它所包含的字串行的物理表示。程式設計人員不必關心陣列的維數或\0方面的問題。

string 在內部封裝了與記憶體和容量有關的資訊。具體地說,c++ string 物件知道自己在記憶體中的開始位置、包含的字串行以及字串行長度;當記憶體空間不足時,string 還會自動調整,讓記憶體空間增長到足以容納下所有字串行的大小。

c++ string 的這種做法,極大地減少了c語言程式設計中三種最常見且最具破壞性的錯誤:

c++ 標準沒有定義 string 類的記憶體布局,各個編譯器廠商可以提供不同的實現,但必須保證 string 的行為一致。採用這種做法是為了獲得足夠的靈活性。

特別是,c++ 標準沒有定義在哪種確切的情況下應該為 string 物件分配記憶體空間來儲存字串行。string 記憶體分配規則明確規定:允許但不要求以引用計數(reference counting)的方式實現。但無論是否採用引用計數,其語義都必須一致。

c++ 的這種做法和c語言不同,在c語言中,每個字元型陣列都佔據各自的物理儲存區。在 c++ 中,獨立的幾個 string 物件可以佔據也可以不佔據各自特定的物理儲存區,但是,如果採用引用計數避免了儲存同一資料的拷貝副本,那麼各個獨立的物件(在處理上)必須看起來並表現得就像獨佔地擁有各自的儲存區一樣。例如:

// #include#include #include using namespace std;

int main()

在 gcc 下的執行結果:

1

s1 = 62345

s2 = 12345

0

只有當字串被修改的時候才建立各自的拷貝,這種實現方式稱為寫時複製(copy-on-write)策略。當字串只是作為值引數(value parameter)或在其他唯讀情形下使用,這種方法能夠節省時間和空間。

不論乙個庫的實現是不是採用引用計數,它對string 類的使用者來說都應該是透明的。遺憾的是,情況並不總是這樣。在多執行緒程式中,幾乎不可能安全地使用引用計數來實現。

Bundle 究竟是什麼?

bundle用於場景 在我印象中比較深刻的是,一般用於activity之間傳遞數值,也用於handler傳送訊息,如下 intent intent new intent bundle bundle new bundle bundle.putstring key value intent.putext...

分析EOF究竟是什麼

eof僅僅是一種狀態或者說條件,需要觸發。read呼叫遇到檔案結尾,觸發該條件,結果將返回0。針對eof,對於標準輸入裝置,普通檔案,管道檔案,網路套接字檔案是read如何觸發呢?下面程式將說明 server.c 是socket套接字服務端,目的為了網路套接字檔案是read如何觸發測試用的。serv...

分析EOF究竟是什麼

eof僅僅是一種狀態或者說條件,需要觸發。read呼叫遇到檔案結尾,觸發該條件,結果將返回0。針對eof,對於標準輸入裝置,普通檔案,管道檔案,網路套接字檔案是read如何觸發呢?下面程式將說明 server.c 是socket套接字服務端,目的為了網路套接字檔案是read如何觸發測試用的。serv...