https://gcc.gnu.org/bugzilla/show_bug.cgi?id=26388

--- Comment #15 from rguenther at suse dot de <rguenther at suse dot de> ---
On February 17, 2017 6:34:07 PM GMT+01:00, "msebor at gcc dot gnu.org"
<gcc-bugzi...@gcc.gnu.org> wrote:
>https://gcc.gnu.org/bugzilla/show_bug.cgi?id=26388
>
>--- Comment #14 from Martin Sebor <msebor at gcc dot gnu.org> ---
>I agree with the goal of making containers efficient so please take
>this as
>constructive criticism.
>
>Jonathan and I discussed this on IRC a bit yesterday and I've thought
>about it
>some more since then.  I'm unconvinced the suggested optimization would
>be
>valid (conforming).  To Marc's point in comment #11, the default vector
>was
>never intended to be stack-based and I'm not aware of any change in the
>standard that would make it valid to allocate it on the stack.  To
>Jonathan's
>point in comment #12, "eventually" means that creating one or more
>non-empty
>vectors can be expected by a conforming program to cause at least one
>call to
>operator new.
>
>Beyond conformance, another, arguably even more important, point to
>consider is
>that vector is required to throw an exception when memory is exhausted.
>
>Implementing it to live on the stack (and allocate memory via alloca)
>would
>either violate that requirement, letting it exhaust the stack and crash
>the
>program, or mean checking the amount of available stack space on every
>allocation (or just the first allocation).  Alternatively, it would
>mean gating
>the optimization on known sizes of the vector that were less than some
>small
>constant maximum (i.e., effectively turning std::vector into
>std::array.)
>
>Jonathan also reminded me that vectors A and B must satisfy the "i =
>A.begin();
>A.swap (B); assert (i == B.begin())" postcondition, with swap having
>constant
>complexity.  A vector allocated on the stack would not, in general, be
>able to
>satisfy these requirements.  It couldn't be swapped with or moved in
>constant
>time to another vector with a different lifetime, further constraining
>the
>optimization.
>
>There may be clever ways to overcome these problems, either by making
>the
>implementation more complex, or by relaxing the standard requirements
>on
>implementations, or (likely both), but they would have costs of their
>own.  The
>former likely in efficiency and significant complexity, and the latter
>in
>constraining programs (i.e., breaking some that are now valid).
>
>So in summary, while I would like to see STL containers be as efficient
>as they
>can be (and have, in fact, been thinking and talking with Jeff about
>how to
>improve them to this end), I don't think this optimization is viable. 
>It may
>be unfortunate but it is the price of generality, customizability, and
>conformance.

Note this bug talks about a middle-end optimization, not a change in libstdc++.
 Obviously such optimization can only be applied when it is valid.

Eliding a new / delete pair is a valid optimization AFAIK.

Reply via email to