2011-06-04 118 views

回答

21

std::string對字節進行操作,而不是對Unicode字符進行操作,所以std::string::size()確實會返回字節數據的大小(當然,無需std::string需要存儲數據的開銷)。

不,std::string只存儲您告訴它存儲的數據(它不需要尾隨的NULL字符)。所以它不會被包含在大小中,除非你明確地創建了一個尾隨NULL字符的字符串。

+0

可以說std :: string與char數組相同嗎?或者有什麼重大差異? – rzetterberg 2011-06-04 08:11:55

+2

是的,char數組正是'std :: string'的意思。 'std :: string'和'std :: vector '之間存在一些實現差異,但它們存儲的數據是相同的。 – 2011-06-04 08:15:37

+7

只是想指出'std :: string :: size()'不包含'NULL'字符的原因是遵循'strlen'設置的約定,該約定也不包括它。爲了以最小的開銷實現'string :: c_str()'方法,'std :: string'的實際實現需要*存儲*來終止'NULL'。也許[這個問題](http://stackoverflow.com/q/4653745)解釋比我更好。 – rwong 2011-06-04 08:23:32

2

是的,size()會給你字符串中的數字char。多字節編碼中的一個字符佔用多個char

5

std::string::size()確實是以字節爲單位的大小。

4

要獲得字符串使用的內存量,您必須將capacity()與用於管理的開銷相加。請注意,它是capacity()而不是size()。容量決定分配的字符數量(charT),而size()會告訴您其中有多少實際使用中。

尤其std::string實現通常不* shrink_to_fit *的內容,因此,如果您創建一個字符串,然後從年底的元素,在size()將遞減,但在大多數情況下(這被定義實現)capacity()將不會。

某些實現可能不會分配所需的確切內存量,而是獲取給定大小的塊以減少內存碎片。在對字符串使用兩個大小的塊的功能的實現中,大小爲17的字符串可以分配多達32個字符。

6

你可能是迂腐一下:

std::string x("X"); 

std::cout << x.size() * sizeof(std::string::value_type); 

不過的std :: string :: value_type的是焦炭和sizeof(char)的定義爲1

如果這僅成爲重要的typedef的字符串類型(因爲它可能會在將來更改或由於編譯器選項)。

// Some header file: 
typedef std::basic_string<T_CHAR> T_string; 

// Source a million miles away 
T_string x("X"); 

std::cout << x.size() * sizeof(T_string::value_type); 
相關問題