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