this r-value optimizations

Nordlöw via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 1 15:47:24 PDT 2017


Given the `struct S` with lots of data fields, I've written the 
following functional way of initializing only a subset of the 
members in an instance of `S`:

struct S
{
     int i;
     float f;
     ...

     this(int i) { this.i = i; }

     S withF(float f)
     {
         // will this be optimized out if `this` is an r-value?
         S copy = this;
         copy.f = f;
         return copy;
     }
}

Now the question becomes: will the S-copying inside `withF` be 
optimized out in the case when `this` is an r-value such as in 
the call

     auto y = S(32).withF(42.0);

?

If not, one solution of doing this manually is to write `withF` 
as a free function

S withF()(auto ref S this_, float f)
{
     static if (__traits(isRef, this_))
     {
         // this_ is an l-value (and was passed by ref)
         // so a copy has to be made before modifying it
     }
     else
     {
         // this_ is an r-value (and was passed by move)
         // so it can be modified in-place
     }
}

Is this the preferred way of solving this until we (ever) get 
named parameters in D?


More information about the Digitalmars-d-learn mailing list