// 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: