On Tue, Aug 9, 2016 at 3:17 PM, Aldy Hernandez <[email protected]> wrote:
> On 08/05/2016 01:55 PM, Richard Biener wrote:
>
> Hi Richard.
>
>> Please don't use std::string. For string building you can use obstacks.
>
>
> Alright let's talk details then so I can write things up in a way you
> approve of.
>
> Take for instance simple uses like all the tree_*check_failed routines,
> which I thought were great candidates for std::string-- they're going to be
> outputted to the screen or disk which is clearly many times more expensive
> than the malloc or overhead of std::string:
>
> length += strlen ("expected ");
> buffer = tmp = (char *) alloca (length);
> length = 0;
> while ((code = (enum tree_code) va_arg (args, int)))
> {
> const char *prefix = length ? " or " : "expected ";
>
> strcpy (tmp + length, prefix);
> length += strlen (prefix);
> strcpy (tmp + length, get_tree_code_name (code));
> length += strlen (get_tree_code_name (code));
> }
>
> Do you suggest using obstacks here, or did you have something else in mind?
Why would you want to get rid of the alloca here?
> How about if it's something like the above but there are multiple exit
> points from the function. I mean, we still need to call obstack_free() on
> all exit points, which is what I wanted to avoid for something as simple as
> building a throw-away string.
But you'll end up in
internal_error ("tree check: %s, have %s in %s, at %s:%d",
buffer, get_tree_code_name (TREE_CODE (node)),
function, trim_filename (file), line);
where you have an interface using C strings again.
It's not that the standard library is bad per-se, it's just using a
tool that doesn't
fit its uses. This makes the code a messy mix of two concepts which is what
I object to.
Yes, the above example may have premature optimization applied. Is that
a reason to re-write it using std::string? No. Is it a reason to rewrite it
using obstracks? No. Just leave it alone.
Richard.
>
> Aldy