我想要得到的字节是std::string
的字符串占用的内存,而不是字符数。该字符串包含一个多字节字符串。 std::string::size()
会为我做这个吗?以字节为单位获取std :: string的字符串的大小
编辑:另外,size()
也包括终止NULL
?
我想要得到的字节是std::string
的字符串占用的内存,而不是字符数。该字符串包含一个多字节字符串。 std::string::size()
会为我做这个吗?以字节为单位获取std :: string的字符串的大小
编辑:另外,size()
也包括终止NULL
?
std::string
对字节进行操作,而不是对Unicode字符进行操作,所以std::string::size()
确实会返回字节数据的大小(当然,无需std::string
需要存储数据的开销)。
不,std::string
只存储您告诉它存储的数据(它不需要尾随的NULL
字符)。所以它不会被包含在大小中,除非你明确地创建了一个尾随NULL
字符的字符串。
是的,size()会给你字符串中的数字char
。多字节编码中的一个字符占用多个char
。
std::string::size()
确实是以字节为单位的大小。
要获得字符串使用的内存量,您必须将capacity()
与用于管理的开销相加。请注意,它是capacity()
而不是size()
。容量决定分配的字符数量(charT
),而size()
会告诉您其中有多少实际使用中。
尤其std::string
实现通常不* shrink_to_fit *的内容,因此,如果您创建一个字符串,然后从年底的元素,在size()
将递减,但在大多数情况下(这被定义实现)capacity()
将不会。
某些实现可能不会分配所需的确切内存量,而是获取给定大小的块以减少内存碎片。在对字符串使用两个大小的块的功能的实现中,大小为17
的字符串可以分配多达32
个字符。
你可能是迂腐一下:
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);
可以说std :: string与char数组相同吗?或者有什么重大差异? – rzetterberg 2011-06-04 08:11:55
是的,char数组正是'std :: string'的意思。 'std :: string'和'std :: vector'之间存在一些实现差异,但它们存储的数据是相同的。 –
2011-06-04 08:15:37
只是想指出'std :: string :: size()'不包含'NULL'字符的原因是遵循'strlen'设置的约定,该约定也不包括它。为了以最小的开销实现'string :: c_str()'方法,'std :: string'的实际实现需要*存储*来终止'NULL'。也许[这个问题](http://stackoverflow.com/q/4653745)解释比我更好。 – rwong 2011-06-04 08:23:32