【问题标题】:std::string append too slow?std::string 追加太慢?
【发布时间】:2010-09-06 08:42:59
【问题描述】:

我有一种情况,我从结构中读取数据并不断将其附加到字符串中,以便可以通过套接字发送。当数据相当大时,此操作会花费大量时间。有人可以提出任何替代方案吗?

我有一个结构

结构文件信息 { int 文件 ID; 字符文件名[16]; 双标签; }

我做了一个 std::stringstream >>file_id 和 stringstream.str() 这对每个值重复,附加到一个字符串并发送

【问题讨论】:

  • 您发布的内容是从stringstream 阅读,而不是写作。那里没有发生附加。

标签: c++


【解决方案1】:

<sstream> 中的std::ostringstream 正是为这种操作模式而设计的。

ostringstream my_text;
my_text << "hello " << 2 << foo << endl; // efficiently catenate

socket.send( my_text.str() ); // get a std::string to handle data

【讨论】:

    【解决方案2】:

    也许您应该单独发送字符串。如果你有一个流式套接字,这应该不会影响另一端接收数据的方式。

    【讨论】:

    • 你的意思是,不是追加,而是发送?
    • @Rajesh:他的意思是,如果 I/O 是本地缓冲的,那么不用担心自己缓冲它。我猜套接字没有缓冲,因为大多数都没有。
    【解决方案3】:

    一种选择是使用std::stringstream。只有提供更具体的信息,才能提供更具体的帮助。你在传输什么样的数据?数据块有多大?

    【讨论】:

    • 这就是我使用的。我将结构值读入字符串流,然后执行 .str() 来获取字符串。我可以直接发送字符串流吗?
    • @Rajesh:你说你使用string,而不是stringstream。它们具有不同的附加运行时特性,因此这是一个相当重要的区别。是什么让你说stringstream 很慢?探查器具体指向什么?
    • 我确实使用了一个字符串...我将 stringstream.str 附加到一个字符串然后发送
    【解决方案4】:

    如果您可以粗略估计字符串的大小,您可以先使用 std::string::reserve() 以避免以后进行多余的重新分配。

    【讨论】:

      猜你喜欢
      • 2013-02-11
      • 2012-06-15
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多