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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|2012-01-24 00:00:00         |2017-1-19
   Target Milestone|---                         |8.0

--- Comment #16 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Marc Glisse from comment #5)
> (The split into push_heap and __push_heap is just so the first part can be
> inlined without the second, right?)
> 
> A more direct adaptation of the old code to rvalue references would be:
> 
>       std::__push_heap(__first, _DistanceType((__last - __first) - 1),
>                        _DistanceType(0), _ValueType(_GLIBCXX_MOVE(*(__last -
> 1))));

I tried doing this and it didn't seem to help the testcase attached here.

> Without the named temporary value, the compiler can perform copy elision.
> Aliaksandr's patch looks like a different way to achieve the same goal.

The patch doesn't apply cleanly, but I made the equivalent changes to the
latest code and found some regressions, so I'll revisit it for gcc 8.

> Note that the current code thus seems to have a performance regression in
> C++03 compared to before the introduction of moves.

Yes.

Reply via email to