2011-12-23 36 views
4

似乎无法找到野外现有的任何东西,这似乎很奇怪。std兼容stringstream使用堆栈分配存储?

因此,在我推出自己的产品之前,有没有人知道在堆栈上分配存储空间的std兼容stringstream?

我想有2种方法来实现这一目标:

最初使用一个静态大小的缓冲区栈上(可能是模板参数允许编译时定制)

  1. 当空间用完恢复使用动态存储
  2. 当空间耗尽使用alloca增加栈存储

这将异体w短于预定大小的字符串快速输入到字符串流中。

对于初始大小的合适选择将意味着可以实现诸如日志记录之类的操作,而无需从堆中频繁调整大小。

+0

你不能使用'_alloca',因为它不会影响调用者的堆栈(即使用stringstream的函数)。 – 2011-12-23 20:37:27

+0

我有一个日志对象,它当前使用一个内部的stringstream对象来存储记录的字符串。在构建字符串时多次调用'operator <<'可能导致多个堆分配。如果我可以使用一个使用堆栈分配存储来存储当前日志行的stringstream类,这将更有效率。 – 2011-12-23 20:43:13

回答

4

您可以通过使用std::basic_stringbuf<char, char_traits<char>, pooled_allocator>获得相同的好处,只需编写合并分配器。

然后,只需创建附加到该缓冲区的basic_iostream

或者,创建一个从basic_streambuf派生的新类。

但是不要重写stringstream。 iostreams库是通过扩展来替换缓冲区对象而设计的。

+0

谢谢本。我从铬项目中找到了这个[stack_allocator](http://src.chromium.org/viewvc/chrome/trunk/src/base/stack_container.h?view=markup),但没有成功使用它。想想我对'std :: basic_ostream' /'std :: basic_stringbuf'等的知识目前还不够强大。 – 2011-12-24 12:26:12