C++ 获取std::string的大小';以字节为单位的字符串
我想获取C++ 获取std::string的大小';以字节为单位的字符串,c++,string,multibyte,C++,String,Multibyte,我想获取std::string的字符串在内存中占用的字节数,而不是字符数。该字符串包含一个多字节字符串。std::string::size()会为我这样做吗 编辑:另外,size()是否也包括终止的NULL?std::string对字节而不是Unicode字符进行操作,因此std::string::size()确实将以字节为单位返回数据的大小(当然,没有std::string需要存储数据的开销) 否,std::string只存储您告诉它要存储的数据(它不需要尾随的NULL字符)。因此,它不会包含
std::string
的字符串在内存中占用的字节数,而不是字符数。该字符串包含一个多字节字符串。std::string::size()
会为我这样做吗
编辑:另外,
size()
是否也包括终止的NULL
?std::string
对字节而不是Unicode字符进行操作,因此std::string::size()
确实将以字节为单位返回数据的大小(当然,没有std::string
需要存储数据的开销)
否,
std::string
只存储您告诉它要存储的数据(它不需要尾随的NULL
字符)。因此,它不会包含在大小中,除非您显式创建一个带有尾随NULL
字符的字符串。是,size()将给出字符串中char
的数量。多字节编码中的一个字符占用多个charstd::string::size()
实际上是以字节为单位的大小。要获得字符串使用的内存量,必须将容量()与用于管理的开销相加。请注意,它是capacity()
,而不是size()
。容量决定分配的字符数(charT
),而size()
告诉您实际使用的字符数
特别是,std::string
实现通常不会收缩以适应内容,因此如果创建一个字符串,然后从末尾删除元素,size()
将减小,但在大多数情况下(这是实现定义的)capacity()
不会减小
一些实现可能不会分配所需的确切内存量,而是获取给定大小的块以减少内存碎片。在对字符串使用两个大小块的幂的实现中,大小为17
的字符串可以分配多达32
个字符。你可能会对它很学究:
std::string x("X");
std::cout << x.size() * sizeof(std::string::value_type);
std::字符串x(“x”);
std::cout在所写的问题中存在固有的冲突:std::string
被定义为std::basic_string
——也就是说,它的元素类型是char
(1字节),但后来您声明“字符串包含一个多字节字符串”(“多字节”=wchar\u t
)
size()
成员函数不计算尾部null。它的值表示字符数(不是字节)
假设您打算说您的多字节字符串是std::wstring
(std::basic_string
的别名),则std::wstring
的字符(包括空终止符)的内存占用为:
std::wstring myString;
...
size_t bytesCount = (myString.size() + 1) * sizeof(wchar_t);
考虑如何编写一个可重用的模板函数是很有启发性的,它将对任何类似STD::Basic字符串这样的潜在实例进行工作:**:
// 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);
}
//返回以null结尾的inString.c_str()占用的字节数。
模板
内联大小\u t stringBytes(常量标准::基本字符串和指令,bool bCountNull)
{
返回(inString.size()+(bCountNull?1:0))*sizeof(_Elem);
}
**为简单起见,忽略很少为std::basic_string
显式指定的特征和分配器类型(它们具有默认值)。说std::string与char数组相同有效吗?或者有什么主要区别吗?是的,char数组正是std::string
的意思。std::string
和std::vector
之间存在一些实现差异,但它们存储的数据是相同的。只想指出原因是std::string::size()
不包括NULL
字符,该字符遵循strlen
设置的约定,strlen也不包括该字符。std::string
的实际实现确实需要存储终止的NULL
,以便以最小的开销实现string::c_str()
方法。也许解释得比我好。虽然<代码> siz()<代码>不考虑尾随<代码> 0 >代码>,但事实是大多数实现将保持一个落后的NUL。该标准要求static_cast(str)[str.size()]
产生0
(铸造到适当的图表
类型),在许多实现中,这是通过始终在末尾保留一个额外的0
来实现的(可以说,它可以通过操作符[]
中的一个条件来实现)。即将到来的标准将这一保证扩展到非常量运算符[]
。此外,也不能保证实现不会分配额外的空间,即容量()>=size()
。感谢Lukáš、rwong和David提供的有用见解。
// 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);
}