Afficher un message
Vieux 17/10/2007, 16h53   #5
terminator(jam)
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pre return optimization

On Oct 16, 9:37 pm, Erik-wikst...@telia.com (Erik Wikström) wrote:
> On 2007-10-16 19:55, terminator(jam) wrote:
>
>
>
>
>
> > On Oct 15, 8:35 pm, Erik Wikström <Erik-wikst...@telia.com> wrote:
> >> On 2007-10-15 17:52, terminator(jam) wrote:
> >> > On Oct 14, 10:00 pm, Erik-wikst...@telia.com (Erik Wikström) wrote:
> >> >> On 2007-10-14 21:19, terminator wrote:

>
> >> >> > On Oct 14, 11:08 am, Greg Herlihy <gre...@pacbell.net> wrote:
> >> >> >> On Oct 9, 8:56 am, "terminator(jam)" <farid.mehr...@gmail.com> wrote:
> >> >> >> The C++ Standard already allows the "(Named) Return Value
> >> >> >> Optimization" (NRVO or RVO for short). The optimization allows (under
> >> >> >> certain conditions) the compiler to construct the result of a function
> >> >> >> call "in place" - that is, directly in the object initialized with the
> >> >> >> function call result.

>
> >> >> >> So, to take advantage of this optimization, a program should use the
> >> >> >> result of a function call to initialize an object, instead of
> >> >> >> assigning the function result to an existing object.

>
> >> >> >> For example:

>
> >> >> >> #include <iostream>

>
> >> >> >> using std::cout;

>
> >> >> >> struct memory_pig
> >> >> >> { // a really large type:
> >> >> >> memory_pig()
> >> >> >> {
> >> >> >> cout << "mem pig default\n";
> >> >> >> }
> >> >> >> memory_pig(memory_pig const&)
> >> >> >> {
> >> >> >> cout << "mem pig copy\n";
> >> >> >> }
> >> >> >> ~memory_pig()
> >> >> >> {
> >> >> >> cout << "mem pig finish\n";
> >> >> >> }
> >> >> >> };

>
> >> >> >> memory_pig foo()
> >> >> >> {
> >> >> >> memory_pig result;
> >> >> >> // ...
> >> >> >> return result;
> >> >> >> }

>
> >> >> >> int main()
> >> >> >> {
> >> >> >> memory_pig m1 = foo();
> >> >> >> memory_pig m2 = foo();
> >> >> >> memory_pig m3 = foo();
> >> >> >> }

>
> >> >> >> I compiled the above program twice, once with and once without NRVO.
> >> >> >> The output of both programs is shown in the two columns below. As this
> >> >> >> comparison shows, NRVO can be a particular effective optimization -
> >> >> >> even for a small C++ program like the one used in this example.

>
> >> >> > I knew about RVO but not NRVO(that is what I am talking about).Is NRVO
> >> >> > standard behavoir or unspecified?
> >> >> > At least my compiler does not perform the NRVO.

>
> >> >> The standard allows this optimisation, but it does not require it (see
> >> >> section 12.8 paragraph 15). I think that most newer compilers support
> >> >> it, but you might have to turn up the optimisation level a bit.

>
> >> >> One important thing to remember is that when NRVO is in use the
> >> >> destructor will not be called for the local object, nor will the copy-
> >> >> constructor for the non-local object (m1 to m3 in the code above) be
> >> >> called. Thus you should not depend on any side effects that the copy-
> >> >> constructor or destructor might have.

>
> >> > prior to return and after return are two different case to me:I mean
> >> > before return even move should be disabled ,while after the return
> >> > either of move/copy must perform .

>
> >> Sorry, but you lost me there, what move? Of what to where?

>
> > Move ctor of course.

>
> Sorry, but I still do not understand. What do you mean with RNVO should
> be disabled before return but not after? It is something that is
> performed *during* return.


I mean the whole concept of optimization(rvo,nrvo,etc). IMHO:
If a function always returns the same local object the returned object
must be the local object itself rather than a copy/move version of the
local.
If a function returns one of its parameter values returned object is
copy/moved from that parameter because a change in location of the
object is almost inevitable.
If an object is constructed with an rvalue it should be copy/moved.

regards,
FM



---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]

  Réponse avec citation
 
Page generated in 0,12022 seconds with 9 queries