std :: string如何实现?
我很想知道std :: string是如何实现的,它与c string有什么不同?如果标准没有指定任何实现,那么任何具有解释的实现对于如何满足标准给出的字符串要求都会很好?
实际上,我使用的每个编译器都为运行时提供了源代码 - 因此,无论您使用的是GCC还是MSVC或其他,都可以查看实现。 但是, std::string
大部分或全部将作为模板代码来实现,这可能会导致非常困难的读取。
Scott Meyer的作品Effective STL有一章关于std :: string的实现,这是对常见变体的一个体面的概述:“第15项:了解string
实现中的变化”。
他谈到了4个变化:
ref-counting实现上的几种变化(通常称为写入时拷贝) - 当字符串对象未被复制时,refcount递增,但实际的字符串数据不变。 两个对象都指向相同的refcounted数据,直到其中一个对象修改它为止,导致数据的“写入时复制”。 这些变化是在像refcount,锁等存储的地方。
一个“短字符串优化”(SSO)实现。 在这种变体中,对象包含常用的指向数据的指针,长度,动态分配的缓冲区的大小等。但是如果字符串足够短,它将使用该区域来保存字符串,而不是动态分配缓冲区
此外,Herb Sutter的“More Exceptional C ++”还有一个附录(附录A:“不在多线程世界中的优化”),讨论了为什么在写入引用的实现上复制由于同步问题而在多线程应用程序中经常遇到性能问题。 该文章也可以在线获得(但我不确定它是否与本书中的内容完全相同):
这两章都值得一读。
std :: string是一个包装某种内部缓冲区并提供操作该缓冲区的方法的类。
C中的字符串只是一个字符数组
解释std :: string在这里工作的细微差别需要很长时间。 也许看看gcc的源代码http://gcc.gnu.org,看看他们是如何做到的。
在此页面上的回答中有一个示例实现。
另外,假设你安装了gcc,你可以看看gcc的实现。 如果没有,您可以通过SVN访问他们的源代码。 大多数std :: string由basic_string实现,所以从这里开始。
另一个可能的信息来源是Watcom的编译器
链接地址: http://www.djcxy.com/p/82705.html