我应该预先分配std :: stringstream吗?

jac*_*hab 22 c++ stl stringstream

std::stringstream广泛使用在我的应用程序中构造字符串和错误消息.在stringstreams通常寿命很短的自动变量.

这样的使用会导致每个变量的堆重新分配吗?我应该从临时stringstream变量转换为类成员变量吗?

在后一种情况下,我该如何保留stringstream缓冲区?(我应该用足够大的字符串初始化它还是有更优雅的方法?)

luk*_*uke 10

你有没有描述过你的执行情况,并发现它们是减速的源头?

考虑他们的用法.它们主要用于代码正常流程之外的错误消息吗?

至于保留空间......

某些实现可能在为字符串流进行任何分配之前保留一个小缓冲区.std :: string的许多实现都是这样做的.

另一种选择可能是(未经测试!)

std::string str;
str.reserve(50);
std::stringstream sstr(str);
Run Code Online (Sandbox Code Playgroud)

您可能会在此gamedev主题中找到更多想法.

编辑:

使用stringstream的rdbuf进行操作也可能是一种解决方案.这种方法可能很容易弄错,所以请确保它是绝对必要的.绝对不优雅或简洁.

  • 我不认为stringstream保留的不仅仅是`str`的​​内容长度(即0).根据cplusplus.com:"使用str的副本构造一个ostringstream对象作为内容." 引用sais"字符串内容的副本".它没有明确说它保留了相同的内存量.我找不到任何关于使用此构造函数保留内存的内容. (8认同)
  • 您可以使用 C++20 来实现: std::stringstream sstr(std::move(str)); 或者如果您完成了像这样的 std::move(sstr).str() 的字符串流,则在提取结果时避免字符串复制 (2认同)

Mon*_*nad 5

尽管“乱搞stringstream 的 rdbuf ...可能很容易出错”,但我还是为了好玩而继续拼凑了一个概念验证,因为没有简单的reserve存储方法一直困扰着我为了stringstream。同样,正如 @luke 所说,您可能最好优化分析器告诉您需要优化的内容,因此这只是为了解决“如果我无论如何都想这样做怎么办?”。

我没有使用stringstream 的 rdbuf,而是制作了自己的 rdbuf ,它的作用几乎相同。它仅实现了最小值,并使用 astring作为缓冲区。不要问我为什么称它为VECTOR_output_stream. 这只是一个快速拼凑在一起的事情。

constexpr auto preallocated_size = 256;
auto stream = vector_output_stream(preallocated_size);
stream << "My parrot ate " << 3 << " cookies.";
cout << stream.str() << endl;
Run Code Online (Sandbox Code Playgroud)