C++的string
相對於C語言的string完善了不少,經過運算符重載能夠很直觀的進行字符串的拼接等操做。ios
GCC 5.0之後的版本採用了__SSO__(短字符串優化)的策略替換了本來的__COW__優化,我寫了幾段代碼來驗證了一下新的實現的一些細節。c++
PS:這裏的全部的內容只是特定平臺特定編譯器的特定行爲。優化
平臺: Windows 64位 MinGW 7.3.0this
#include <iostream> using namespace std; int main(int argc, char* argv[]) { string a = "123456789abcde"; //15個char string s("this is the edge"); //16個char string longstr("Scaramouche, scaramouche will you do the Fandango"); //長串 在heap分配 cout << &a << " " << (void*)a.c_str() << endl; cout << &s << " " << (void*)s.c_str() << endl; cout << &longstr << " " << (void*)longstr.c_str() << endl; cout << sizeof(char*) << endl; cout << sizeof(s) << endl; return 0; }
0x62fde0 0x62fdf0 0x62fdc0 0x7d17d0 0x62fda0 0x7d1b40 8 32
在這裏我經過c_str
打印串開始的地址。spa
從輸出咱們能夠看出來string佔32個字節,其中16個字節實際上用於存儲字符。指針
咱們建立出來的三個對象地址相差0x20
(32)個字節,後兩個的指針地址於對象的地址相差很遠,應該是在堆上動態分配的內存,而第一個字符串的存儲地址(0x62fdf0)於對象的起始地址(0x62fde0)只差__0x10__,而對象大小__0x20__,全部這個串實際上就是存儲在這個程序棧中.code
上文的 SSO 實際上值得就是短的字符串(strlen(s)<15
,即最多包含15個char和'0')直接存儲在對象裏,更長的串再存儲在堆上開闢的空間裏。對象
C++的string
與xstring
和sds
在不少狀況下很相像。內存