当我们必须使用字符串操作时,std::string 和 std::stringbuf 之间是否存在显着的性能差异,如果是,为什么。
更一般地说,什么时候最好使用 std::stringbuf 而不是 std::string ?
Astd::stringbuf
在内部使用字符串来缓冲数据,因此它可能会慢一些。我认为差异不会很大,因为它基本上只是授权。不过,为了确保您必须运行一些性能测试。
std::stringbuf
当您希望 IO-stream 使用字符串作为缓冲区(如std::stringstream
,std::stringbuf
默认使用 a )时很有用。
首先,astd::stringbuf
不一定(甚至通常)使用 anstd::string
作为其内部存储。例如,该标准描述了std::string
如下的初始化:
构造类 basic_stringbuf 的对象...然后将 str 的内容复制到 basic_stringbuf 底层字符序列 [...]
注意措辞:“字符序列”——至少对我来说,这似乎非常小心,以避免说(甚至暗示)内容应该存储在实际的字符串中。
过去,我认为效率可能是一个红鲱鱼。它们都是相当薄的包装器,用于管理动态分配的某种字符序列的缓冲区。功能上有很大的不同(例如,string
在字符串中间有很多搜索和插入/删除,而stringbuf
. stringbuf
鉴于其目的,在诸如 a 之类的东西之上实现可能是有意义的std::deque
,以优化末端插入/删除的(通常)路径,但这对于大多数用途来说可能是微不足道的。
如果我这样做,我可能最担心的stringbuf
是可能只与支持。stringstream
stringstream
std::stringbuf
扩展std::string
容器,用于读取和写入std::string
.
std::string
通常,和之间没有显着的性能差异std::stringbuf
。
因为std::streambuf
<- std::stringbuf
,都是因为:
typedef basic_stringbuf<char> stringbuf;
typedef basic_string<char> string;
阅读本文了解更多详情。