<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 12, 2014 at 2:19 PM, Rafael EspĂ­ndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">> The buffering avoids a virtual dispatch for each call (potentially each<br>
> character) because raw_ostream is a virtual interface that gets passed into<br>
> streamers which don't know which subclass is in use.<br>
><br>
> (I experimented disabling buffering with raw_null_ostream() and even then<br>
> the buffering helps avoid lots of calls to the no-op virtual write_impl()<br>
> function. So it looks like a good design to me.)<br>
<br>
</div>I see.<br>
<br>
Do you know how many of these calls could be avoided by implementing<br>
operotor<< in the derived class too? I.E, how often do we known that<br>
we are streaming to a string?<br>
<br>
Having forgot to add some calls to flush myself in the past I agree<br>
that it would be nice to have some API that lets us avoid that. If<br>
that can be done efficiently in the common case with an external<br>
buffer, that is better.</blockquote></div></div><br><div>The really tricky thing is to have a non-virtual size-adjusting operation that the base raw_ostream can use to indicate how large things are. In addition to that, you'd also want std::string to expose the ability to do uninitialized resizing, but we could at least teach SmallString to allow that. But I don't know how to capture the size into a variant underlying type as-you-go in any efficient way.</div>
<div><br></div><div>Honestly, I would be more interested in something which provided more debugging tools when flush fails to be called. That would also help all of the users of the stream interface that *need* the stream interface. And while I too have made this mistake, it just isn't that common (mostly because writing code using streams isn't that common).</div>
</div>