性能字符串与字符串

performance stringbuf vs string

本文关键字:字符串 性能      更新时间:2023-10-16

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

更一般地说,当使用 std::stringbuf 而不是 std::string 时更好?

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

当您希望 IO 流使用字符串作为缓冲区时,std::stringbuf很有用(如 std::stringstream ,默认情况下使用 std::stringbuf)。

首先,std::stringbuf不一定(甚至通常)使用std::string进行内部存储。例如,该标准描述了从std::string初始化,如下所示:

构造类 basic_stringbuf 的对象...然后复制的内容 str 进入basic_stringbuf底层角色序列 [...]

注意措辞:"字符序列" - 至少对我来说,这似乎非常小心,以避免说(甚至暗示)内容应该存储在实际字符串中。

除此之外,我认为效率可能是一个红鲱鱼。它们都是相当薄的包装器,用于管理某种类似字符序列的动态分配缓冲区。功能有很大的不同(例如,string在字符串中间有很多搜索和插入/删除,而stringbuf中完全没有)。鉴于其目的,在诸如std::deque之类的东西上实现stringbuf可能是有意义的,以优化末端的(通常)插入/删除路径,但这对于大多数用途来说可能是无关紧要的。

如果我这样做,我可能最担心的是stringbuf可能只与stringstream一起测试,所以如果我使用它的方式与stringstream不同,我可能会遇到问题,即使我遵循标准所说的它应该支持的内容。

std::stringbuf扩展std::string容器,用于读取和写入std::string

通常,std::stringstd::stringbuf 之间没有显着的性能差异。

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

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

阅读此内容以获取更多详细信息。