C 標準庫中 string 使用的優化技術

2021-08-13 01:36:07 字數 993 閱讀 4405

往容器中新增元素,若是要使用移動語義,一樣的使用 std::move.

int main();

std::cout << (int*)(s.c_str()) << "\n";

std::vectorvec;

vec.push_back(std::move(s));

std::cout << (int*)(vec[0].c_str());

return 0;

}

得到的位址卻不一樣,說明並沒有移動。原因其實是標註庫使用sso(small string optimization)優化技術。典型的string 和 vector的實現都是包含:1、乙個指向堆記憶體的指標 2、乙個表示當前使用容量的size 3、乙個表示當前申請的記憶體可以容納最大元素的capacity。

不過由於堆記憶體申請相對於開銷大,所以使用了sso技術之後,可以將小字串放到棧中。

對於乙個長字串,再做試驗。

在vs2013 和 mingw gcc 7.1.0 上測試都如此。

在linux gcc 4.8.5 上沒有這個優化,即使字串很短只有乙個位元組,輸出的位址仍然一樣,說明 linux gcc 總是使用的移動語義。

另外乙個字串過去常用的優化是 cow(copy on write)。寫時複製的原因是大多數時候,使用到的字串並不會對其修改(像 python 中的字串乾脆就不能修改),所以在複製字串時,只對其進行淺拷貝,到需要更改字串時,再進行深拷貝,對深拷貝過來的內容進行修改。寫時複製依賴引用計數技術。

不過寫時複製,對於 operator() 或者 .at() 來訪問單個元素,有潛在的改寫字串的可能性,所以對於這兩個成員方法也需要先深拷貝,這無疑導致很多複雜性。所以現在的編譯器很少使用這個優化。

STL標準庫string的使用

內部實現和vector類似,用法為 include string str1 liming 以乙個c風格字串構造 string str2 zhanghan string str3 abcde 3 取abc作為str3的初始化值string str4 空字串 string str5 同上,空字串 注 不...

string標準庫型別 C

c 中string的學習體會 string 1 不允許把兩個字串字面值連線起來,乙個string物件 字串字面值返回的是string物件.string size type只是string裡方便移植性的定義的一種型別 2 cout include using namespace std int mai...

C 標準庫string型別

c 組成 基本資料型別和抽象資料型別標準庫 只需知道抽象資料型別支援的操作而不需關心內部表示 命名空間兩種使用方法 using std name 和 using namespace std 標準庫string型別和字串字面值不是同一型別 具體區別?getline 函式 string line get...