// Example of RVO
                      Bar Foo()
                      {
                      	return Bar();
                      }
                       
                       // Example of NRVO
                      Bar Foo()
                      {
                      	Bar bar;
                      	return bar;
                      }
                       
                       // Example of N/RVO 
                      #include <iostream>
                       
                      struct MyClass
                      {
                      	MyClass()
                      	{
                      		std::cout << "MyClass::c_tor()" << std::endl;
                      	}
                      	
                      	MyClass(MyClass const &)
                      	{
                      		std::cout << "MyClass::cc_tor()" << std::endl;
                      	}
                      	
                      	~MyClass()
                      	{
                      		std::cout << "MyClass::d_tor()" << std::endl;
                      	}
                      }; 
                      MyClass NRVO()
                      {
                      	std::cout << "Named Return value Optimization" << std::endl;
                      	
                      	MyClass myClass;
                      	return myClass;
                      };
                       
                      MyClass RVO()
                      {
                      	std::cout << "Return value Optimization" << std::endl;
                      	
                      	return MyClass();
                      }; 
                      MyClass NoNRVO()
                      {
                      	std::cout << "** NO *** Named Return value Optimization -- this is unlikely to optimize" << std::endl;
                      	
                      	if(0)
                      	{
                      		MyClass myClass;
                      		return myClass;
                      	}
                      	else
                      	{
                      		MyClass myClass;
                      		return myClass;
                      	}
                      }; 
                      MyClass NoRVO()
                      {
                      	std::cout << "** NO *** Return value Optimization ??? -- this should still optimize" << std::endl;
                      	
                      	if(0)
                      	{
                      		return MyClass();
                      	}
                      	else
                      	{
                      		return MyClass();
                      	}
                      }; 
                      int main(void)
                      {
                      	std::cout << ">>> START >>>" << std::endl;
                      	
                      	MyClass myClass1 = NRVO();
                      	MyClass myClass2 = RVO();
                      	
                      	MyClass myClass3 = NoNRVO();
                      	MyClass myClass4 = NoRVO(); 
                      	std::cout << "<<< END <<<" << std::endl;
                      }
                      
                       
                      Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.
Comments (2)
Commented:
It is highly relevant, not only when optimizing, also when designing your classes.
We use a lot of 3D math code, using points/vectors/matrices.
Without this kind of optimization, we could not simply write (without performance hit):
point = matrix * point;
we would have to write something like:
multiply(matrix, point_input, point_result);
taking a reference to point_result, so there is no temporary object and no unnecessary copy.
This latter version can get very ugly for long formulas.
So this really matters for C++ programmers, great article Rix :)
Commented: