我想得到std::string
字符串在内存中占用的字节数,而不是字符数。该字符串包含多字节字符串。 std::string::size()
会为我做这件事吗?
编辑:此外,size()
是否也包含终止NULL
?
答案 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::wstring
(std::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<>
明确指定的特征和分配器类型(它们有默认值)。