Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取std::string的大小';以字节为单位的字符串_C++_String_Multibyte - Fatal编程技术网

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
的数量。多字节编码中的一个字符占用多个
char

std::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);
}