Afficher un message
Vieux 15/10/2007, 18h35   #2
Erik Wikström
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pre return optimization


===================================== MODERATOR'S COMMENT:

Please trim unnecessary material when replying.


===================================== END OF MODERATOR'S COMMENT
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:

>>
>> >> > consider:

>>
>> >> > struct memory_pig{//a really large type:

>>
>> >> > memory_pig(){
>> >> > std::cout<<"mem pig default\n";
>> >> > //etc...
>> >> > };

>>
>> >> > memory_pig(memory_pig const&){
>> >> > std::cout<<"mem pig copy\n";
>> >> > //etc...
>> >> > };

>>
>> >> > ~memory_pig(){
>> >> > std::cout<<"mem pig finish\n";
>> >> > //etc...
>> >> > };

>>
>> >> > //etc...

>>
>> >> > };///struct memory_pig

>>
>> >> > memory_pig foo(){
>> >> > memory_pig result;
>> >> > result=something;
>> >> > //etc...
>> >> > result=something_else;
>> >> > return result;

>>
>> >> > };

>>
>> >> > any time 'foo' is called the output will contain the following
>> >> > sequence:

>>
>> >> > mem pig default
>> >> > mem pig copy
>> >> > mem pig finish

>>
>> >> > the last line of output may repeat based on how the result is
>> >> > stored(rvo) or not.
>> >> > So,two objects of a large type will be constructed and at least one is
>> >> > destructed on every call to 'foo'

>>
>> >> 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?

--
Erik Wikström

---
[ 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,08597 seconds with 9 queries