当我们必须使用字符串操作时,std :: string和std :: stringbuf之间是否有任何显着的性能差异,如果是,为什么。
更常见的是,在std :: string上使用std :: stringbuf是好的吗?
答案 0 :(得分:6)
std::stringbuf
在内部使用字符串来缓冲数据,所以它可能会慢一些。我不认为差异会很大,因为它基本上只是委托。确保你必须运行一些性能测试。
std::stringbuf
,默认情况下使用std::stringstream
), std::stringbuf
非常有用。
答案 1 :(得分:3)
首先,std::stringbuf
不必须(或通常)使用std::string
作为其内部存储空间。例如,该标准描述了std::string
的初始化,如下所示:
构造类basic_stringbuf的对象...然后复制内容 str进入basic_stringbuf底层字符序列[...]
注意措辞:“字符序列” - 至少对我而言,这似乎是非常小心避免说(或甚至暗示)内容应存储在实际的字符串中。
过去,我认为效率可能是一个红色的鲱鱼。它们都是相当薄的包装器,用于管理某种字符序列的动态分配缓冲区。功能有很大差异(例如,string
在字符串中间有很多搜索和插入/删除,stringbuf
完全没有。鉴于其目的,在stringbuf
之类的东西上实现std::deque
可能是有意义的,以优化末尾插入/删除的(通常)路径,但这可能是非实质性的最常用的。
如果我这样做,我可能最担心stringbuf
可能只与stringstream
一起测试,所以如果我使用它与stringstream
不一样我可能会遇到问题,即使我遵循标准所说应该支持的内容。
答案 2 :(得分:0)
std::stringbuf
扩展std::string
容器,用于读写std::string
。
通常,std::string
和std::stringbuf
之间没有显着的性能差异。
因为std::streambuf
< - std::stringbuf
,因为:
typedef basic_stringbuf<char> stringbuf;
typedef basic_string<char> string;
阅读this了解详情。