RVO is stands for "return value optimization" and NRVO for "named return value optimization".
What does all this staff mean?
Typically, when a function returns an instance of an object, a temporary object is created and copied to the target object via the copy constructor.
RVO is a simple way of optimization when compiler doesn't create temporary when you return anonymous instance of class/structure/etc. from the function.
class C
{
public:
C()
{
std::cout << "Constructor of C." << std::endl;
}
C(const C &)
{
std::cout << "Copy-constructor of C." << std::endl;
}
};
C func()
{
return C();
}
int main(int argc, char **argv)
{
C c = func();
return 0;
}The output should beConstructor of C.Here compiler do not make a copy of C instance on return. This is a great optimization since construction of the object takes time. The implementation depends on compiler but in general compiler extends function with one parameter - reference/pointer to the object where programmer wants to store the return value and actually stores return value exact into this parameter.
It may look like
C func(C &__hidden__)
{
__hidden__ = C();
return;
}NRVO is more complex. Say you haveclass C
{
public:
C()
{
std::cout << "Constructor of C." << std::endl;
}
C(const C &c)
{
std::cout << "Copy-constructor of C." << std::endl;
}
};
C func()
{
C c;
return c;
}
int main(int argc, char **argv)
{
C c = func();
return 0;
}Here compiler should deal with named object c. With NRVO temporary object on return shouldn't be created. The pseudocode ofC func()
{
C c;
c.method();
c.member = 10;
return c;
}might look likeC func(C &__hidden__)
{
__hidden__ = C();
__hidden__.method();
__hidden__.member = 10;
return;
}In both cases temporary object is not created for copying(copy-constructor is not invoked) from the function to the outside object.When this may not work?
Situation I known when these optimizations won't work when function have different return paths with different named objects.


No comments:
Post a Comment