我很想知道std::string是如何实现的,它与c字符串有何不同?如果标准没有指定任何实现,则任何带有说明的实现都会很好,说明它如何满足标准给出的字符串要求。
std::string
的大部分或全部将被实现为模板代码,这可能会使阅读变得非常困难。
Scott Meyer的书《Effective STL》有一章关于std::string实现的概述:"Item 15: Be aware of variations in string
implementations"。这两个章节都值得阅读。
sizeof
影响。 - Matthieu M.std::string是一个类,它包装了一些内部缓冲区并提供了操作该缓冲区的方法。
C语言中的字符串只是字符数组。
在这里解释std::string如何工作的所有细节需要太长时间。也许可以查看gcc源代码http://gcc.gnu.org来确定它们如何实现。
这个页面 答案中有一个示例实现。
另外,如果你已经安装了gcc,你可以查看他们的实现。如果没有,你可以通过SVN访问它们的源代码。大部分std :: string是由basic_string实现的,所以从那里开始。
另一个可能的信息来源是Watcom编译器
C++中的字符串解决方案与C版本有很大不同。最重要的区别是,C使用ASCIIZ解决方案,而std::string和std::wstring使用两个迭代器(指针)来存储实际字符串。字符串类的基本用法提供了动态分配的解决方案,因此在处理字符串时,由于动态内存处理的CPU开销,使得字符串处理更加舒适。
正如您可能已经知道的那样,C不包含任何内置的通用字符串类型,只通过标准库提供了一些字符串操作。C++提供了一个封装功能,所以它可以被认为是一个伪通用类型。
在C中,如果您想知道字符串的长度,您需要遍历字符串,而std::string::size()成员函数只需要一条指令(end - begin)。只要有内存,您就可以安全地将字符串追加到另一个字符串中,因此无需担心缓冲区溢出错误(因此也没有漏洞),因为追加会在需要时创建更大的缓冲区。
正如某人在这里之前说过的那样,字符串是从向量功能派生出来的,以模板方式进行,因此更容易处理多字节字符系统。您可以使用typedef std::basic_string specific_str_t;表达式定义自己的字符串类型,其中任意数据类型都可以作为模板参数。
我认为双方有足够的利弊:
C++字符串优点: - 在某些情况下迭代速度更快(明确使用大小,它不需要从内存中获取数据来检查您是否到达了字符串的末尾,比较两个指针。这可能会在缓存方面产生差异) - 缓冲区操作与字符串功能打包在一起,因此对缓冲区问题的担忧较少。
C++字符串缺点: - 由于动态内存分配等原因,基本用法可能会影响性能。(幸运的是,您可以告诉字符串对象应该是原始缓冲区的大小,因此除非超出它,否则它不会从内存中分配动态块) - 与其他语言相比,名称通常很奇怪且不一致。这是关于任何STL东西的坏处,但您可以习惯它,并且它会产生一种特定的C++风格感觉。 - 模板的大量使用迫使标准库使用基于头文件的解决方案,因此对编译时间有很大影响。