總結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程式設計中,主要資料...