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 .
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 ]