C string的SOW和SSO策略

2021-10-21 23:50:09 字數 1061 閱讀 5865

總結cow(copy-on-write):寫時複製,即複製的時候不立即申請記憶體(淺拷貝),而在寫操作的時候才開始申請記憶體進行複製。

sso(small string optimization):短字串優化,即複製時立即申請記憶體(深拷貝),但當字串較短時存在棧中。

注意:c++11標準string不允許cow[參考21.4 class template basic_string],目前大多數的編譯器都拋棄了cow,轉向sso策略。

舊版本編譯器如vc6或gcc 4採用cow,vc2010/gcc 5等編譯器是sso。

cow使用引用計數的方式,在複製時只是簡單地將引用計數+1,兩者指向的是同一塊空間,而只有當寫操作(具有修改語意義的操作)時才會申請空間,此時引用計數會-1,如果引用計數為0,則釋放記憶體。

string origin =

"cow"

;string copy = origin;

cout << boolalpha <<

(origin.

c_str()

== copy.

c_str()

)<< endl;

//同一塊空間,輸出true

引用計數的原子性操作(加鎖)

分配記憶體時引用計數不可操作,分配複製完後引用計數-1

sso的結構帶有緩衝buffer,當字串較小(不同編譯器/作業系統不一樣)時直接儲存在buffer中(棧),當字串較長時儲存在堆中。

string origin =

"sso"

;string copy = origin;

cout << boolalpha <<

(origin.

c_str()

== copy.

c_str()

)<< endl;

//sso直接分配空間,輸出false

現代化的編譯器大多數都是實現的sso策略,我們在編碼過程中不用太關注string的實現細節,但對於cow和sso的基本概念要有基礎的了解,更進一步的了解cow和sso策略可以檢視對應編譯器提供的原始碼。

認證和SSO 五 基於token的SSO

1.1 修改 方法,獲得到token後,由存放到session改為存放到cookie 方法 接收認證伺服器發來的授權碼,並換取令牌 param code 授權碼 param state 請求授權伺服器時傳送的state 將token放到session中 token authresult.getbod...

C string報未引入和CString互轉

c 在使用string類的時候報錯 string undeclared identifier 解決方法 include 引入string.而不是,using namespace std 引入命明空間.如果要輸出內容就要用 include include using namespace std cst...

string和CString 的比較

一 概述 string和cstring均是字串模板類,string為標準模板類 stl 定義的字串類,已經納入c 標準之中 cstring typedef cstringt cstring 為visual c 中最常用的字串類,繼承自c stringt類,主要應用在mfc和atl程式設計中,主要資料...