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
