偶然間碰到一個一個問題,問題大概是這樣子的:C++中一個std::string 變量中包含1萬個字符,如果sizeof這個變量,會得這個變量占有多少個字節;於是在網上搜集資料進行驗證:
代碼如下:
1 #include<iostream> 2 #include<string> 3 4 int main(){ 5 std::string str_test1; 6 std::string str_test2 = "Hello Word"; 7 8 int value1, value2,value3; 9 10 value1 = sizeof(str_test1); 11 value2 = sizeof(str_test2); 12 value3 = sizeof(std::string); 13 14 std::cout<<"str_test1占" << value1 <<" 個字節" <<std::endl; 15 std::cout<<"str_test2占" << value2 <<" 個字節" <<std::endl; 16 std::cout<<"string占" << value3 <<" 個字節" <<std::endl; 17 18 return 0; 19 }
用g++編譯后,得到的結果如下:
1 root@sukingw:~/algorithm# ./sizeofString 2 str_test1占32 個字節 3 str_test2占32 個字節 4 string占32 個字節 5 root@sukingw:~/algorithm#
這說明所有的std::string占用32個字節,回看代碼可發現str_test1和string都沒有賦值,而str_test2賦有值,結果卻是一樣的。這是為什么呢?
搜集資料發現:
string的實現在各庫中可能有所不同,但是在同一庫中相同一點是,無論你的string 里放多長的字符串,它的sizeof()都是固定的,字符串所占的空間是從堆中動態分配 的,與sizeof()無關。 sizeof(string)=4可能是最典型的實現之一,不過也有sizeof() 為12、32字節的庫實現(如本例)。
通常,我們所用到的 string 類型一般都會是這樣實現:
class { char *_Ptr; //指向字符串的指針 int _Len; //字符串的長度 ........ };
所以,我們一般接觸到的string類型所占字節數為 8+。