22

我想获取 astd::string的字符串在内存中占用的字节数,而不是字符数。该字符串包含一个多字节字符串。会std::string::size()为我做这个吗?

编辑:另外,是否size()还包括终止NULL

4

6 回答 6

26

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

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

于 2011-06-04T08:04:02.400 回答
9

你可能对此很迂腐:

std::string x("X");

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

但是 std::string::value_type 是 char 并且 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);
于 2011-06-04T10:21:32.250 回答
5

std::string::size()确实是以字节为单位的大小。

于 2011-06-04T08:04:24.257 回答
4

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

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

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

于 2011-06-04T08:38:17.503 回答
2

是的, size() 会给你char字符串中的数量。多字节编码中的一个字符占用多个char.

于 2011-06-04T08:04:23.273 回答
0

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

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

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

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

考虑如何编写一个可重用的模板函数,该函数适用于任何潜在的 std::basic_string<> 实例化,如下所示**:

// 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<>(它们具有默认值)。

于 2018-05-30T22:49:21.273 回答