Is NRVO part of the spec?

Peter Alexander via Digitalmars-d digitalmars-d at puremagic.com
Sat Feb 7 07:14:23 PST 2015


On Saturday, 7 February 2015 at 15:02:43 UTC, Andrei Alexandrescu 
wrote:
> On 2/7/15 6:35 AM, Daniel Murphy wrote:
>> "Peter Alexander"  wrote in message
>> news:uiqnamficseklfowmkyf at forum.dlang.org...
>>
>>> I'm writing a blog post about why we don't need rvalue 
>>> references in
>>> D. It seems that we rely on NRVO being performed, not just as 
>>> an
>>> optimization, but for correct semantics (e.g. for objects 
>>> without
>>> destructors or postblits). This doesn't appear to be 
>>> documented anywhere.
>>>
>>> Is it meant to be part of the spec?
>>
>> NRVO isn't required for correct semantics, as structs can be 
>> moved with
>> bitcopy.
>
> It is required for structs that disable postblit. -- Andrei

NRVO specifically means that a pointer to the destination object 
is passed to the function, and the returned object is constructed 
in place. The in place construction isn't required. What is 
required is that the local is moved.

e.g.

S foo() {
   S s;
   return s;
}
S s = foo();


With NRVO becomes:

void foo(ref S dst) {
   dst = S();
}
S s = void;
foo(s);


But this isn't necessary. Would also be valid to just do:

void foo(ref S dst) {
   S s;
   move(dst, s);  // do the memcpys
}
S s;
foo(s);


This distinction matters because NRVO cannot be performed when 
foo may return two different objects, but we can still move and 
avoid postblit.


More information about the Digitalmars-d mailing list