的std :: string是如何实现的?(How is std::string implement

2019-07-19 04:01发布

我很好奇地想知道字符串是如何的std ::实现的,它是如何从C字符串有什么不同?如果标准不指定任何实现再与任何解释的实施将是巨大的它是如何满足由标准给出的字符串的要求?

Answer 1:

几乎每一个我用编译器提供源代码运行时 - 所以无论你使用GCC或MSVC或什么的,你一定要看执行情况的能力。 然而,有很大一部分或全部std::string将被实现为模板代码,它可以使非常困难的阅读。

斯科特·迈尔的书,有效的STL ,对的std :: string实现一章这是常见的变化体面的概述:“第15项:注意在变化的string实现”。

他谈到4的变化:

  • 上的参考计数的执行(通常称为写时复制)的若干变化 - 当一个字符串对象被复制不变,引用计数被递增,但实际的字符串数据是没有的。 这两个对象都指向同一个引用计数的数据,直到对象的一个​​修改它,“写入时复制”的数据引起。 变化是存储在何处之类的东西引用计数,锁具等。

  • “短串优化”(SSO)的实现。 在这种变型中,该对象包含通常的指针数据,长度,动态分配缓冲器的大小等,但如果字符串是足够短,它将使用区域来保存字符串,而不是动态分配缓冲器

此外, 香草萨特的“更出色的C ++”有一个附录(附录A:“优化不在(在多线程的世界)”),讨论为什么写引用计数实现复制往往在多线程应用中,由于同步问题的性能问题。 这篇文章也可在网上(但我不知道这是否是完全一样的书是什么):

  • http://www.gotw.ca/publications/optimizations.htm

这两个章节将是值得阅读。



Answer 2:

的std :: string是环绕某种内部缓冲器,并提供用于操作该缓冲器方法的类。

在C A字符串只是字符数组

在解释的std :: string是如何在这里工作的所有细微之处需要太长时间。 也许看看gcc的源代码http://gcc.gnu.org ,看看他们究竟是如何做到这一点。



Answer 3:

有一个在一个示例实现此页面上的答案 。

此外,你可以看看gcc的执行,假设你安装GCC。 如果没有,你可以通过SVN访问他们的源代码 。 大多数的std :: string是通过实现basic_string的 ,所以从这里开始。

信息的另一个可能的来源是WATCOM的编译器



Answer 4:

对于字符串中使用C ++的解决方案是从C-版本完全不同。 在使用ASCIIZ的解决方案,的std :: string和std :: wstring的的C是使用两个迭代器(指针)来存储实际的字符串中的第一个也是最重要的区别是。 string类的基本用法提供了一个动态分配的解决方案,因此在CPU开销与动态内存处理它的成本,使字符串处理更加舒适。

正如你可能已经知道,C不包含任何内置的通用字符串类型,只有通过标准库提供几个字符串操作。 一个C和C之间的主要区别++该C ++提供了一个包裹的功能,因此它可以被看作是一个伪造的一般类型的。

在C语言中,你需要通过串走,如果你想知道它的长度时,的std :: string ::大小()成员函数只有一条指令(结束 - 开始)基本相符。 您可以放心的,只要你有记忆字符串追加到其他,所以没有必要担心缓冲区溢出漏洞(因此攻击),因为如果它是需要的追加创建一个更大的缓冲。

正如之前有人在这里说,该字符串从载体功能推导,在模板的方式,所以这让我们很容易对付的多字节字符系统。 您可以使用的typedef的std :: basic_string的specific_str_t定义自己的字符串类型; 表达与模板参数的任何arbitary数据类型。

我认为有足够的优点和反政府两侧:

C ++字符串优点: - 在某些情况下更快的迭代(使用尺寸肯定,它并不需要从内存中的数据来检查,如果你是在字符串的结尾,比较两个指针,可以使与差异。高速缓存) - 缓冲区操作都挤满了字符串的功能,所以有关缓冲区的问题较少的忧虑。

C ++字符串缺点: - 由于动态内存分配的东西,基本的使用可能会导致对性能的影响。 (幸运的是,你可以告诉String对象应该是什么原始缓冲区的大小,所以,除非你是超过它,它不会从分配内存的动态块) - 常常奇怪,名称不一致相对于其他语言。 这是任何STL的东西不好的事情,但你可以使用它,它使一个有点特殊的C ++十岁上下的感觉。 - 模板的大量使用强制标准库使用基于头解决方案,因此它是在编译时有很大的影响。



Answer 5:

这取决于你使用的标准库。

STLPort的例如是一个C ++标准库实现它实现了除其他事项外字符串。



文章来源: How is std::string implemented?