Re: NRVO or I think so
K?r?at wrote:
Hi,
I have a very simple class :
class Foo
{
private :
int m_nVal;
public:
Foo () {cout << "Constructor..." << endl;}
Foo (const Foo&) {cout << "Copy constructor..." << endl;}
~Foo () {cout << "Destructor..." << endl;}
void setter (int nVal) {m_nVal = nVal;}
};
And some code using this class :
1 Foo getFoo ()
2 {
3 Foo foo_1;
4
5 foo_1.setter (11);
6
7 return foo_1;
8 }
9
10 int _tmain (int argc, _TCHAR* argv [])
11 {
12 Foo foo = getFoo ();
13 return 0;
14 }
I expeced this output :
Constructor... (For line 3)
Copy constructor... (For line 7, a temporary object is copy-constructed from
foo_1)
Destructor... (For foo_1)
Copy constructor... (For line 12, foo is copy-constructed from the temporary
object)
Destructor... (for foo)
Destructor... (for the temporary object)
but the real output is (using Visual Studio 2008 compiler with debug
configuration) :
Constructor...
Copy constructor...
Destructor...
Destructor...
When I checked the assemby out I see address of the foo pushed into the
stack and used directly in getFoo () rather than creating a new temporary.
This is the optimization named NRVO, isn't this?
But I am compiling in debug configuration and optimizations are disabled,
why the compiler apply NRVO and how can I deactivate NRVO?
The compiler is allowed to forgo creating another temporary in the case of
T func(); // function that returns a T
T o = func(); // initialisation of another T
and construct the return value directly into 'o' (see [class.copy]/15).
It is not really *optimization*. It's just allowed to construct the
object directly into the other one. Since it's part of the language,
the implementation-specific optimization mechanisms probably do not
apply here. And besides, VC++ developers probably chose to always apply
those because they may have thought there was no sense in letting the
users control this. Unlike inlining, for example.
And why would you *want* to deactivate NRVO?
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask