std :: string vs. char*

Elo*_*fin 13 c++

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

Pot*_*ter 13

char*

  • 是您的CPU架构的一个指针的大小.
  • 可以是从malloccallocnew或返回的值new[].
    • 如果是这样,必须传递到freedeletedelete[]当你完成.
    • 如果是这样,则字符存储在堆上.
  • 可能是由于char[ N ](常数N)数组或字符串文字的"分解"造成的.
    • 通常,无法判断char*参数是指向堆栈,堆还是全局空间.
  • 不是班级类型.它参与表达式但没有成员函数.
  • 然而,实现RandomAccessIterator接口以便与之一起使用<algorithm>.

std::string

  • 几个指针的大小,往往是三个.
  • 在创建时构造自己:不需要newdelete.
    • 如果字符串可能被更改,则拥有该字符串的副本.
    • 可以从a复制此字符串char*.
    • 默认情况下,内部使用new[]很多,就像获取a一样char*.
  • 提供隐式转换,使得从一个char*或文字透明化构造.
  • 是一种类型.为表达式定义其他运算符,例如catenation.
    • 定义c_str()哪个返回char*临时使用.
  • std::string::iteratorbegin()和实现类型end().
    • string::iterator很灵活:一个实现可以使它成为一个范围检查的超级安全调试助手,或者只是char*在交换机翻转时超高效.


dcw*_*dcw 5

如果你的意思是,它是否连续存储,那么答案是它不是必需的,但所有已知的(对我来说,无论如何)实现都这样做.这最有可能支持c_str()data()成员要求,即返回一个连续的字符串(在以下情况下以null结尾c_str())

就存储器的存储位置而言,它通常在堆上.但是一些实现采用"短字符串优化",其中短字符串内容存储在小的内部缓冲区中.因此,在字符串对象在堆栈上的情况下,存储的内容也可能在堆栈上.但这对你如何使用它没有任何影响,因为一个对象被破坏,存储字符串数据的内存在任何一种情况下都是无效的.

(顺便说一下,这里有一篇关于类似技术的文章,它解释了优化.)

  • C++ 0x委员会发现所有当前的实现都是连续存储的,因此他们决定将语言固定并使其成为一项要求.对不起,我没有提到支持它. (6认同)
  • @Mark:以下是您正在寻找的参考资料:http://herbsutter.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/#comment-483和http:/ /www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530 (3认同)