[Patch] Fix libstdc++/11722
Paolo Carlini
pcarlini@suse.de
Tue Sep 14 15:01:00 GMT 2004
Hi Nathan,
and, first, sorry for not having explained in detail these details of my
code,
thus wasting at least part of your time.
>Sorry for being late with this, but isn't
>
>+ if (__avail == 1)
>+ *__s = *this->gptr();
>+ else if (__avail > 1)
>+ traits_type::move(__s, this->gptr(), __avail);
>+ __s += __avail;
>+ this->gbump(__avail);
>+ __ret += __avail;
>+ __n -= __avail;
>
>a bit too precious?
>
Definitely! But...
> Maybe
>
> if (__avail != 0)
> {
> traits_type::copy(__s, this->gptr(), __avail);
> __s += __avail;
> this->gbump(__avail);
> __ret += __avail;
> __n -= __avail;
> }
>
>This way it doesn't waste time checking __gptr < __egptr again
>when __avail == 1, and doesn't waste time adding zeroes to __s,
>__ret, and __n when __avail == 0. A really smart optimizer
>might do part of that transformation, but it seems clearer not
>to depend on it.
>
>
We have *very* consistent evidence that special casing the single char case
leads to much better performance (at least with the current optimizers):
remember the *impressive* improvement we got in basic_string
http://gcc.gnu.org/ml/libstdc++/2004-04/msg00096.html
?
This leads to the most important source of "uglyness" in the code...
>We are at least certain that the target __s doesn't overlap the
>buffer, so traits_type::copy suffices, and ought to be faster.
>
This is (even) more subtle: indeed, I wanted to use copy. Then, i considered
the possibility of a user provided buffer (via setbuf), which he can
control and
access directly. In that case, as a matter of QoI, I think we should
allow the user
to carry out some strange tricks, i.e., calling sgetn with a pointer inside
his setbuf-ed get area. That crazy user expects, I think, the semantics
of move.
What do you think? Shall we allow that kind of weird code?
Thanks again for your feedback,
Paolo.
More information about the Libstdc++
mailing list