性能stringbuf vs string

时间:2012-04-25 09:41:59

标签: c++ string

当我们必须使用字符串操作时,std :: string和std :: stringbuf之间是否有任何显着的性能差异,如果是,为什么。

更常见的是,在std :: string上使用std :: stringbuf是好的吗?

3 个答案:

答案 0 :(得分:6)

std::stringbuf在内部使用字符串来缓冲数据,所以它可能会慢一些。我不认为差异会很大,因为它基本上只是委托。确保你必须运行一些性能测试。

如果希望IO流使用字符串作为缓冲区(如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::stringstd::stringbuf之间没有显着的性能差异。

因为std::streambuf< - std::stringbuf,因为:

typedef basic_stringbuf<char> stringbuf;    
typedef basic_string<char> string;

阅读this了解详情。