C++ 有没有办法减少ostringstream malloc/free';s

C++ 有没有办法减少ostringstream malloc/free';s,c++,memory,stl,stringstream,ostringstream,C++,Memory,Stl,Stringstream,Ostringstream,我正在写一个嵌入式应用程序。在某些地方,我经常使用std::ostringstream,因为它对我的目的非常方便。然而,我刚刚发现性能受到了极大的影响,因为向流中添加数据会导致大量调用malloc和free。有什么办法可以避免吗 我的第一个想法是使ostringstream成为静态的,并使用ostringstream::set(“”)重置它。但是,这不能做到,因为我需要函数是可重入的。如果在创建流之前知道数据有多大,可以使用OSTREAM,其构造函数可以将缓冲区作为参数。因此,不会对数据进行内存

我正在写一个嵌入式应用程序。在某些地方,我经常使用std::ostringstream,因为它对我的目的非常方便。然而,我刚刚发现性能受到了极大的影响,因为向流中添加数据会导致大量调用malloc和free。有什么办法可以避免吗


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

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

处理此问题的经批准的方法可能是创建自己的
basic\u stringbuf
对象,用于
ostringstream
。为此,你有两个选择。一种是使用固定大小的缓冲区,当/如果您试图创建太长的输出时,
溢出
就会失败。另一种可能是使用向量作为缓冲区。与std::string不同,vector保证附加数据将具有摊销常量复杂性。它也永远不会从缓冲区释放数据,除非您强制释放,所以它通常会增长到您处理的最大大小。从这一点上讲,除非您创建的字符串超出了当前可用的长度,否则它不应该分配或释放内存。

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

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

我们解决这个问题的方法是跳过很多障碍,以确保我们在启动时执行所有字符串转换(此时我们还不必是实时的)。我确实认为有一种情况,我们将自己的转换器写入一个固定大小的堆栈分配数组。我们有一些大小上的限制,我们可以指望为具体的转换问题


对于更一般的解决方案,您可以考虑编写自己的OSTRIGNSTROW版本,它使用固定大小的缓冲区(当然,错误检查在限制范围内)。这将是一点工作,但如果你有很多这样的流操作,它可能是值得的

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

Dupe-Hmm。。。但是,dupe问题没有给出有效的答案。此外,“dupe”预先假定了答案。我检查了我正在使用的STL实现的源代码,如果我将一个字符串传递给ostringstream构造函数,它只会复制该字符串……是的,我希望如此。我建议您创建自己的stringbuf对象,并向其附加一个流。如果您想传递正在使用的缓冲区,请不要使用流ostringstream@Mark:也许吧。如果你真的想要一个固定大小的缓冲区,这是一个合理的可能性。它甚至不能替代使用
vector
作为缓冲区的方法。Tru但answer提供了一个固定大小的缓冲区。我开始添加,但退出了。我将继续为您提供。您至少可以使用snprintf(带有堆栈缓冲区),但我仍然不会提倡这种做法,除非评测显示它提供了您需要的好处,并且您认为缺点值得使用。我没有检查snprintf,但我怀疑它会有与sprintf在我们的平台上相同的不确定性问题。如果您仔细想想,两者都不应该进行动态内存分配……但我们的sprintf却做到了:-(评测明确显示malloc/free在我们的系统上非常昂贵,我们以前遇到过它……本教程有助于实现定制的std::streambuf