Testing Return Value Optimization (RVO)

Rene Zwanenburg via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Sep 27 07:39:36 PDT 2015


On Sunday, 27 September 2015 at 13:55:02 UTC, chmike wrote:
> Can someone please explain me why this doesn't work as I would 
> expect RVO to work ?

I'm not an expert on the subject so this may contain some 
inaccuracies, but the gist of it is:

As the name implies, NRVO is an optimization and therefore 
generally not guaranteed. The compiler is free to use NRVO or 
not, as it sees fit.

In D there is one case where NRVO is required for correct 
semantics and therefore guaranteed: returning a struct with 
disabled postblit. For example:

import std.stdio;
struct S
{
	int i;
	@disable this(this);
}

S foo()
{
	S rv;
	writeln(&rv);
	return rv;
}

void main()
{
	auto s = foo();
	writeln(&s);
}

This will print the same address twice even without optimizations.

If the postblit isn't disabled the compiler will not use NRVO for 
returning S in this case. Which makes sense, because S is only 
four bytes, so writing through a pointer will actually be slower. 
On the other hand if S is large enough, the compiler will switch 
to using NRVO when possible:

struct S
{
	int[16] i; // I just used some large value, didn't test the 
threshold
}

S foo()
{
	S rv;
	writeln(&rv);
	return rv;
}

void main()
{
	auto s = foo();
	writeln(&s);
}


More information about the Digitalmars-d-learn mailing list