std :: string存储数据的方式与堆栈或堆上的char *不同,还是只是从char *派生到类中?
答案 0 :(得分:13)
char*
malloc
或calloc
或new
或new[]
返回的值。
free
或delete
或delete[]
。char[ N ]
(常数N)数组或字符串文字的“分解”引起的。
char*
参数是否指向堆栈,堆或全局空间。<algorithm>
等一起使用。std::string
new
或delete
。
char*
。new[]
,就像获取char*
一样。char*
或文字c_str()
,返回char*
以供临时使用。std::string::iterator
和begin()
实现end()
类型。
string::iterator
非常灵活:一个实现可以使其成为范围检查的超级安全调试帮助程序,或者仅仅在交换机时只是一个超级高效的char*
。答案 1 :(得分:5)
如果你的意思是,它是否连续存储,那么答案是它不是必需的,但所有已知的(对我而言)实现都是如此。这很可能支持c_str()
和data()
成员要求,即返回连续的字符串(在c_str()
的情况下以null结尾)
就内存的存储位置而言,它通常位于堆上。但是一些实现采用“短字符串优化”,其中短字符串内容存储在小的内部缓冲区中。因此,在字符串对象在堆栈上的情况下,存储的内容也可能在堆栈上。但这对你如何使用它没有任何影响,因为一个对象被销毁,存储字符串数据的内存在任何一种情况下都会失效。
(顺便说一句,这是an article on a similar technique applied generally,它解释了优化。)
答案 2 :(得分:2)
这些解决了不同的问题。 char*
(或char const*
)指向C样式字符串,该字符串不一定由存储char*
指针的字符串所拥有。在C中,由于缺少字符串类型,您必须经常使用char*
作为“字符串类型”。
std::string
拥有它指向的字符串数据。因此,如果您需要在班级的某个地方存储字符串,那么您可能希望使用std::string
或图书馆的字符串类而不是char*
。
关于std::string
的存储的连续性,其他人已经回答了。