我想获取 astd::string
的字符串在内存中占用的字节数,而不是字符数。该字符串包含一个多字节字符串。会std::string::size()
为我做这个吗?
编辑:另外,是否size()
还包括终止NULL
?
std::string
对字节进行操作,而不是对 Unicode 字符进行操作,因此std::string::size()
确实会以字节为单位返回数据的大小(std::string
当然,没有存储数据的开销)。
不,std::string
只存储您告诉它存储的数据(它不需要尾随NULL
字符)。因此它不会包含在大小中,除非您明确创建带有尾随NULL
字符的字符串。
你可能对此很迂腐:
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);
std::string::size()
确实是以字节为单位的大小。
要获得字符串使用的内存量,您必须将capacity()
与用于管理的开销相加。请注意,它是capacity()
而不是size()
。容量决定了charT
分配的字符 ( ) 的数量,同时size()
告诉您其中有多少是实际使用的。
特别是,std::string
实现通常不会 *shrink_to_fit* 内容,因此如果您创建一个字符串然后从末尾删除元素,size()
则会减少,但在大多数情况下(这是实现定义的)capacity()
不会。
某些实现可能不会分配所需的确切内存量,而是获取给定大小的块以减少内存碎片。在对字符串使用两个大小的块的幂的实现中,具有大小的字符串17
可以分配与32
字符一样多的内容。
是的, size() 会给你char
字符串中的数量。多字节编码中的一个字符占用多个char
.
所写的问题存在固有的冲突: 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<>
(它们具有默认值)。