2011-06-04 75 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); 
相关问题