is not an lvalue
Alex Rønne Petersen
xtzgzorex at gmail.com
Sun Mar 11 17:59:14 PDT 2012
On 12-03-2012 01:55, Caligo wrote:
> With the latest DMD I've noticed that the following no longer works:
>
> struct A { int[4] _data; }
>
> struct B {
> ref B foo(const ref A a) { }
> }
>
> B b = B().foo(A([1, 2, 3, 4])); // Error: A() is not an lvalue
>
>
> How much of a difference is 'ref' supposed to make once DMD improves
> in the future? Am I better off not using 'ref'? I suppose I still
> don't know when to go with 'ref' and when not to.
>
> Is there supposed to be a performance difference between something like this:
>
> // _1
> struct B {
> ref B foo(const ref A a){ }
> }
>
> A a = A([1, 2, 3, 4]);
> B b = B().foo(a);
>
> and this:
>
> // _2
> struct B {
> ref B foo(A a){ }
> }
>
> B b = B().foo(A([1, 2, 3, 4]));
>
>
> ???
>
> P.S.
> In the past I've noticed improvement in performance when using 'ref'.
> With the latest DMD, using 'ref' is actually slightly slower (at least
> in the above example)
OK, so the new behavior is correct. You can only pass a variable or a
field to a ref parameter, not the result of a computation of any kind
(hence the error). Also, ref vs non-ref only matters once you get beyond
structs of size 32 bytes in my experience.
--
- Alex
More information about the Digitalmars-d-learn
mailing list