获取std :: string的字符串的大小(以字节为单位)

时间:2011-06-04 08:00:33

标签: c++ string multibyte

我想得到std::string字符串在内存中占用的字节数,而不是字符数。该字符串包含多字节字符串。 std::string::size()会为我做这件事吗?

编辑:此外,size()是否也包含终止NULL

6 个答案:

答案 0 :(得分:24)

std::string对字节进行操作,而不是对Unicode字符进行操作,因此std::string::size()确实会以字节为单位返回数据大小(没有std::string存储数据所需的开销,疗程)。

不,std::string仅存储您告诉它存储的数据(它不需要尾随NULL字符)。因此,除非您明确创建一个尾随NULL字符的字符串,否则它不会包含在大小中。

答案 1 :(得分:6)

你可能对此很迂腐:

std::string x("X");

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

但是std :: string :: value_type是char,sizeof(char)定义为1。

只有在键入字符串类型时才会变得很重要(因为它可能会在将来发生变化,或者因为编译器选项而发生变化)。

// 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);

答案 2 :(得分:5)

std::string::size()确实是字节大小。

答案 3 :(得分:4)

要获取字符串使用的内存量,您必须将capacity()与用于管理的开销相加。请注意,它是capacity()而不是size()。容量决定了分配的字符数(charT),而size()告诉您实际使用的字符数。

特别是,std::string实现通常不会* shrink_to_fit *内容,因此如果您创建一个字符串然后从末尾删除元素,size()将会递减,但在大多数情况下(这是实现定义的)capacity()不会。

某些实现可能不会分配所需的确切内存量,而是获取给定大小的块以减少内存碎片。在为字符串使用两个大小的块的功能的实现中,大小为17的字符串可以分配32个字符。

答案 4 :(得分:2)

是的,size()会在字符串中显示char的数量。多字节编码中的一个字符占用多个char

答案 5 :(得分:0)

问题中存在固有的冲突:std::string被定义为std::basic_string<char,...> - 也就是说,它的元素类型是char(1字节),但后来你说了“该字符串包含多字节字符串”(“multibyte”== wchar_t?)。

size()成员函数不计算尾随空值。它的值表示字符数(不是字节)。

假设您打算说您的多字节字符串是std::wstringstd::basic_string<wchar_t,...>的别名),std::wstring的字符的内存占用量,包括空终止符是:

std::wstring myString;
 ...
size_t bytesCount = (myString.size() + 1) * sizeof(wchar_t);

考虑如何编写一个可重用的模板函数是有益的,该函数可用于std :: basic_string&lt;&gt;的任何潜在实例化。像这样**:

// Return number of bytes occupied by null-terminated inString.c_str().
template <typename _Elem>
inline size_t stringBytes(const std::basic_string<typename _Elem>& inString, bool bCountNull)
{
   return (inString.size() + (bCountNull ? 1 : 0)) * sizeof(_Elem);
}

**为简单起见,忽略很少为std::basic_string<>明确指定的特征和分配器类型(它们有默认值)。