std :: string vs. char *

时间:2010-04-20 03:31:09

标签: c++

std :: string存储数据的方式与堆栈或堆上的char *不同,还是只是从char *派生到类中?

3 个答案:

答案 0 :(得分:13)

char*

  • 是您的CPU架构的一个指针的大小。
  • 可以是从malloccallocnewnew[]返回的值。
    • 如果是这样,必须在完成后转到freedeletedelete[]
    • 如果是,则字符存储在堆上。
  • 可能是由char[ N ](常数N)数组或字符串文字的“分解”引起的。
    • 一般来说,无法判断char*参数是否指向堆栈,堆或全局空间。
  • 不是班级类型。它参与表达式但没有成员函数。
  • 尽管如此,还是实现了RandomAccessIterator接口,以便与<algorithm>等一起使用。

std::string

  • 是几个指针的大小,通常是三个。
  • 创建时自行构建:无需newdelete
    • 拥有该字符串的副本,如果该字符串可能被更改。
    • 可以从char*
    • 复制此字符串
    • 默认情况下,内部使用new[],就像获取char*一样。
  • 提供隐式转换,使char*或文字
  • 的结构透明化
  • 是班级类型。为诸如catenation之类的表达式定义其他运算符。
    • 定义c_str(),返回char*以供临时使用。
  • 使用std::string::iteratorbegin()实现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的存储的连续性,其他人已经回答了。