代码之家  ›  专栏  ›  技术社区  ›  Johan Kotlinski

有没有办法减少排斥流malloc/free?

  •  8
  • Johan Kotlinski  · 技术社区  · 16 年前

    我正在写一个嵌入式应用程序。在一些地方,我使用STD::OSTRIGNSWORD很多,因为它非常方便,我的目的。但是,我刚刚发现性能的影响是极端的,因为向流中添加数据会导致对malloc和free的大量调用。有什么办法可以避免吗?

    我的第一个想法是使ostringstream静态化,并使用ostringstream::set(“”)重置它。但是,这无法完成,因为我需要函数可重入。

    4 回复  |  直到 16 年前
        1
  •  2
  •   T.E.D.    16 年前

    好, Booger 的解决方案是切换到 sprintf() . 它不安全,而且容易出错,但通常速度更快。

    但并非总是如此。初始化之后,我们不能在我的实时作业上使用它(或ostringstream),因为这两者都执行内存分配和释放。

    我们解决这个问题的方法是跳过许多圈,以确保在启动时执行所有的字符串转换(当我们还不需要实时的时候)。我确实认为有一种情况,我们将自己的转换器写入一个固定大小的堆栈分配数组中。对于所讨论的特定转换,我们对大小有一些限制。

    对于更一般的解决方案,您可以考虑编写自己版本的ostringstream,该版本使用固定大小的缓冲区(当然,在边界上进行错误检查的情况下)。这将是一个工作,但如果你有一个 许多 在这些流操作中,它可能是值得的。

        2
  •  2
  •   Gregor Brandt    16 年前

    如果在创建流之前知道数据有多大,那么可以使用ostrstream,其构造函数可以将缓冲区作为参数。这样就不会对数据进行内存管理。

        3
  •  2
  •   Jerry Coffin    16 年前

    可能处理这件事的方法是创建自己的 basic_stringbuf 用于您的 ostringstream . 为此,你有几个选择。一种方法是使用固定大小的缓冲区, overflow 如果您试图创建的输出太长,则会失败。另一种可能是使用向量作为缓冲区。与STD::字符串,向量保证,附加数据将摊销恒定的复杂性。它也永远不会从缓冲区释放数据,除非您强制它,所以它通常会增长到您要处理的最大大小。从那时起,它不应该分配或释放内存,除非您创建的字符串超出了它当前可用的长度。

        4
  •  1
  •   MSalters    16 年前

    std::ostringsteam 是一个方便的接口。它链接了一个 std::string 到A std::ostream 通过提供自定义 std::streambuf . 您可以实现自己的STD::这允许您进行整个内存管理。您仍然可以获得 STD:: 但是您可以完全控制内存管理。当然,其结果是您得到格式化的输出 char[] -但如果你是一个嵌入式开发人员,这可能不是什么大问题。