Re: Check if an argument is temporary
On Oct 29, 4:22 pm, gpderetta <gpdere...@gmail.com> wrote:
On Oct 29, 1:45 pm, Erik Wikstr=F6m <Erik-wikst...@telia.com> wrote:
On 2007-10-29 12:27, gpderetta wrote:
[...]
Make A::operator= take the argument by Value instead of
reference, then swap 'this' and the argument:
So you remove one copy and create a new. By taking the
argument by value a copy must be made so nothing is won.
It is the asignment operator, so, yes, you need to do at least one
copy.
Not necessarily. If the argument to the operator= is a value,
rather than a reference, the compiler can use RVO or NRVO when
it constructs it; roughly speaking, the array that is being
constructed in foo() will be the one that the operator= sees.
Consider
the canonical exception safe operator=:
A& A::operator=(A const& rhs) {
A tmp(rhs);
using std::swap;
swap(*this, rhs);
return *this;
}
You have to do a copy anyway, but if you capture by value
instead of reference, you save a copy if the argument was an
rvalue anyway.
Generally, I prefer this form, simply because the reference
argument is really what is expected, and seeing something else
on an operator= may cause (a little) confusion. If the
profiler says that the copy is a bottleneck, however, it's not
something so important that I'd let it stop me from using the
value. In such cases, it is a definite improvement in
performance; if the compiler correctly implements RVO and NRVO
(and many do), then you may easily end up without any copies
what so ever; a new object is constructed with its new values in
the function, and that object is swapped with the existing one
in the operator=.
There are doubtlessly other solutions, based on helper classes,
which can also be used. They are significantly more complex,
but can be made to avoid the copy even if the compiler doesn't
implement NRVO or RVO.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34