Should I preallocate std::stringstream?

std::ostringstream
std::string reserve
stringstream clear
std stringstream rdbuf
std::stringbuf
std stringstream operator
c 17 std stringstream
std stringstream include

I use std::stringstream extensively to construct strings and error messages in my application. The stringstreams are usually very short life automatic variables.

Will such usage cause heap reallocation for every variable? Should I switch from temporary to class-member stringstream variable?

In latter case, how can I reserve stringstream buffer? (Should I initialize it with a large enough string or is there a more elegant method?)

Have you profiled your execution, and found them to be a source of slow down?

Consider their usage. Are they mostly for error messages outside the normal flow of your code?

As far as reserving space...

Some implementations probably reserve a small buffer before any allocation takes place for the stringstream. Many implementations of std::string do this.

Another option might be (untested!)

std::string str;
str.reserve(50);
std::stringstream sstr(str);

You might find some more ideas in this gamedev thread.

edit:

Mucking around with the stringstream's rdbuf might also be a solution. This approach is probably Very Easy To Get Wrong though, so please be sure it's absolutely necessary. Definitely not elegant or concise.

Should I preallocate std::stringstream?, I use std::stringstream extensively to construct strings and error messages in my application. The stringstreams are usually very short life automatic variables. I know one of the advantages of the std::stringstream is that it is a std::istream so it may accept input from any type that defines operator to std::istream, and also to the primitives type. I am not going to use the operator , I am just going to concatenate a lot of strings.

I'm not sure, but I suspect that stringbuf of stringstream is tightly related with resulted string. So I suspect that you can use ss.seekp(reserved-1); ss.put('\0'); to reserve reserved amount of bytes inside of underlying string of ss. Actually I'd like to see something like ss.seekp(reserved); ss.trunc();, but there is no trunc() method for streams.

ostringstream preallocate Solutions, I suspect this is because we havn't preallocated memory and the memory allocation scheme in the stings is slow for >1.5megs. How can I preallocate memory for a� How NOT to preallocate space for std::vector. Efficient use of std::vector requires that we reserve space in advance. While we often do not know the exact size of our vector, we do have some information about the scale of the problem. Which is why we choose to preallocate memory ahead of time.

Although "mucking around with the stringstream's rdbuf...is probably Very Easy To Get Wrong", I went ahead and hacked together a proof-of-concept anyway for fun, as it has always bugged me that there is no easy way to reserve storage for stringstream. Again, as @luke said, you are probably better off optimizing what your profiler tells you needs optimizing, so this is just to address "What if I want to do it anyway?".

Instead of mucking around with stringstream's rdbuf, I made my own, which does pretty much the same thing. It implements only the minimum, and uses a string as a buffer. Don't ask me why I called it a VECTOR_output_stream. This is just a quickly-hacked-together thing.

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

4. Optimize String Use: A Case Study - Optimized C++ [Book], std::string implementations do a trick to amortize the cost of reallocating std:: string 's reserve() member function to preallocate the estimated amount of storage. C++ contains yet another kind of string. std::stringstream does for strings what� Stream class to operate on strings. Objects of this class use a string buffer that contains a sequence of characters. This sequence of characters can be accessed directly as a string object, using member str.

how do i create a ostringstream with pre-allocated memory buffer, std::ostringstream os(s);. The line s.resize(size) gives 's' a size of 3 million elements. The last line makes a copy of 's', and if you string is not reference counted,� Now head is a [1 x 10] struct array withe the fields 'number' and 'pck_rv'. Pre-allocating the contents of the fields is another job and you need a loop to do this. But now it can run in forward direction also.

std::string::reserve, string::reserve #include <iostream> #include <fstream> #include <string> int that the object str could suffer each time that inserting a new character would� preallocate vector or not. Learn more about vector . Alternatively, a cell array does not require contiguous memory allocation (well, all elements inside a cell are in contiguous memory locations), so it might be a (slower) alternative to your problem, as it does not require reallocating your array if it overruns an empty memory block.

Direct iostream formatting: vectorstream and bufferstream, int number; //Data reader std::istringstream input_processor; //This makes a copy string we should copy data from a std::stringstream to a std::string and then to the //!Does not throw. const vector_type &vector() const; //!Preallocates memory � We live in an era where budget PCs come with 1TB HDDs. There's absolutely no damn reason we should be waiting an hour to preallocate 40+GBs. Modern games are huge, modern hard drives are huge-er. I would consider myself a bit of a power-user, I get the risk that "well you might fill your drive before the game finishes downloading" -- thats MY RISK.

关于c ++:我应该预分配std :: stringstream吗?, Some implementations probably reserve a small buffer before any allocation takes place for the stringstream. Many implementations of std::string do this. The class template basic_string stores and manipulates sequences of char-like objects, which are non-array objects of trivial standard-layout type. The class is dependent neither on the character type nor on the nature of operations on that type.

Comments
  • Good advice; however, reserving 50 then copying that string might instead defeat a small non-heap buffer optimization (if your implementation has one). If you want to write your own streambuf, then you have precise control over all buffer management; you'd then use ostream (or istream or iostream, but the question indicates output formatting is the concern here) with your streambuf rather than changing a stringstream's buffer through rdbuf.
  • I don't think stringstream reserve anything more than str's content length (which is 0) . According to cplusplus.com: "Constructs a ostringstream object with a copy of str as content.". The reference sais "copy of string content". It doesn't explicitly say that it reserves the same amount of memory. I couldn't find any source that says anything about reserving memory using this constructor.
  • The constructor you use above is no longer valid. You can see that the no-copy constructor was removed. cplusplus.com/reference/sstream/stringstream/stringstream
  • I have tested it in Visual Studio 2015 Update 3 and seams that raises the badbit on. The followed << operators would fail on it.
  • I'm usually don't trust behaviour of MSVC. But as per seekp and seekpos I see no requirements to support or not support that operation. Thus you cannot rely that code to be working equally across different compilers+runtimes, I guess.