[英]Length of a C string: std::strlen() vs. std::char_traits<char>::length()
[英]std::string vs. char*
std :: string存储数据的方式与堆栈或堆上的char *不同,还是只是从char *派生到类中?
char*
malloc
或calloc
或new
或new[]
返回的值。
free
或delete
或delete[]
。 char[ N ]
(常数N)数组或字符串文字的“分解”引起的。
char*
参数是否指向堆栈,堆或全局空间。 <algorithm>
等一起使用。 std::string
new
或delete
。
char*
复制此字符串。 new[]
就像获取char*
。 char*
或literal透明化。 c_str()
,它返回一个char*
供临时使用。 begin()
和end()
实现std::string::iterator
类型。
string::iterator
非常灵活:一个实现可以使它成为一个范围检查的超级安全调试助手,或者只是一个交换机翻转时的超高效char*
。 如果你的意思是,它是否连续存储,那么答案是它不是必需的,但所有已知的(对我而言)实现都这样做。 这很可能支持c_str()
和data()
成员要求,即返回连续的字符串(在c_str()
的情况下以null结尾)
就存储器的存储位置而言,它通常在堆上。 但是一些实现采用“短字符串优化”,其中短字符串内容存储在小的内部缓冲区中。 因此,在字符串对象在堆栈上的情况下,存储的内容也可能在堆栈上。 但这对你如何使用它没有任何影响,因为一个对象被破坏,存储字符串数据的内存在任何一种情况下都是无效的。
(顺便说一下,这里有一篇关于类似技术的文章 ,它解释了优化。)
这解决了不同的问题。 char*
(或char const*
)指向C样式字符串,该字符串不一定由存储char*
指针的字符串所拥有。 在C中,由于缺少字符串类型,您必须经常使用char*
作为“字符串类型”。
std::string
拥有它指向的字符串数据。 因此,如果您需要在类中的某个位置存储字符串,那么您可能希望使用std::string
或librarie的字符串类而不是char*
。
关于std::string
存储的连续性,其他人已经回答了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.