C++ string的SSO

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++的stringxstringsds在不少狀況下很相像。內存

相關文章
相關標籤/搜索